1 4 formas de analizar archivos XML
Existen cuatro métodos clásicos para analizar archivos XML. Hay dos métodos de análisis básicos, uno se llama SAX y el otro se llama DOM. SAX se basa en el análisis de flujos de eventos y DOM se basa en el análisis de la estructura del árbol de documentos XML. Sobre esta base, para reducir la cantidad de codificación para DOM y SAX, surgió JDOM. Su ventaja es que el principio 20-80 (principio de Pareto) reduce en gran medida la cantidad de código. En circunstancias normales, JDOM se utiliza para cumplir con funciones simples a implementar, como análisis, creación, etc. Pero en el nivel inferior, JDOM todavía usa documentos SAX (el más utilizado), DOM y Xanan. El otro es DOM4J, que es una API XML de Java muy, muy excelente con excelente rendimiento, funciones potentes y extrema facilidad de uso. También es un software de código abierto. Hoy en día, se puede ver que cada vez más software Java utiliza DOM4J para leer y escribir XML. Vale la pena mencionar que incluso JAXM de Sun también utiliza DOM4J. Para el uso específico de los cuatro métodos, busque en Baidu y encontrará muchas introducciones detalladas.
2 Una breve introducción a XPath
XPath es un lenguaje para buscar información en documentos XML. XPath se utiliza para navegar a través de elementos y atributos en documentos XML y para recorrer elementos y atributos. XPath es un elemento importante del estándar W3C XSLT, y tanto XQuery como XPointer se basan en expresiones XPath. Por lo tanto, comprender XPath es la base de muchas aplicaciones XML avanzadas. XPath es muy similar al lenguaje SQL para operaciones de bases de datos, o JQuery, lo que facilita a los desarrolladores obtener lo que necesitan en el documento. DOM4J también admite el uso de XPath.
3 DOM4J usando XPath
Cuando DOM4J usa XPath para analizar documentos XML, primero debe hacer referencia a dos paquetes JAR en el proyecto:
dom4j-1.6.1.jar: paquete de software DOM4J, dirección de descarga http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar: normalmente, si no se agrega este paquete, se generará una excepción (java.lang.NoClassDefFoundError: org/jaxen/JaxenException La dirección de descarga es http://www.jaxen.org/releases). .html.
3.1 Interferencia del espacio de nombres
Al procesar archivos xml convertidos desde archivos Excel u otros archivos de formato, a menudo nos encontramos con situaciones en las que no se pueden obtener resultados mediante el análisis XPath. Esta situación suele deberse a la existencia de espacios de nombres. Tomando como ejemplo el archivo XML con el siguiente contenido, si realiza una búsqueda simple a través de XPath=" // Libro de trabajo/Hoja de trabajo/Tabla/Fila[1]/Celda[1]/Datos[1] ", normalmente no se obtendrán resultados. aparecer. Esto se debe al espacio de nombres (xmlns="urn:schemas-microsoft-com:office:spreadsheet").
Copie el código de código de la siguiente manera:
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel " xmlns:ss="urna:esquemas-microsoft-com:office:hoja de cálculo" xmlns:html="http://www.w3.org/TR/REC-html40">
<Hoja de trabajo ss:Nombre="Hoja1">
<Tabla ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
<Fila ss:AutoFitHeight="0">
<Celda>
<Data ss:Type="String">Rata que escribe códigos</Data>
</Celda>
</fila>
<Fila ss:AutoFitHeight="0">
<Celda>
<Data ss:Type="String">Soleado</Data>
</Celda>
</fila>
</Tabla>
</hoja de trabajo>
</libro>
3.2 XPath analizando archivos xml con espacios de nombres
El primer método (función read1()): utilice local-name() y namespace-uri() que vienen con la sintaxis XPath para especificar el nombre del nodo y el espacio de nombres que desea utilizar. Escribir expresiones XPath es más problemático.
El segundo método (función read2()): establezca el espacio de nombres XPath y utilice la función setNamespaceURIs().
El tercer método (función read3()): establece el espacio de nombres de DocumentFactory(), la función utilizada es setXPathNamespaceURIs(). Escribir expresiones XPath en los métodos dos y tres es relativamente sencillo.
El cuarto método (función read4 (): el método es el mismo que el tercer método, pero la expresión XPath es diferente (reflejada específicamente en el programa. Es principalmente para probar la diferencia en la expresión XPath, principalmente en referencia a la integridad). y si afectará la eficiencia de recuperación.
(Todos los cuatro métodos anteriores utilizan DOM4J combinado con XPath para analizar archivos XML)
El quinto método (función read5 (): use DOM combinado con XPath para analizar el archivo XML, principalmente para probar la diferencia de rendimiento.
¡Nada habla más que el código! ¡Codifique con decisión!
Copie el código de código de la siguiente manera:
paqueteXPath;
importjava.io.IOException;
importjava.io.InputStream;
importarjava.util.HashMap;
importjava.util.List;
importarjava.util.Map;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.xpath.XPathConstants;
importjavax.xml.xpath.XPathExpression;
importjavax.xml.xpath.XPathExpressionException;
importjavax.xml.xpath.XPathFactory;
importorg.dom4j.Documento;
importorg.dom4j.DocumentException;
importorg.dom4j.Elemento;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
/**
*DOM4JDOMXMLXRuta
*/
clase públicaTestDom4jXpath{
publicstaticvoidmain(String[]argumentos){
leer1();
leer2();
leer3();
read4(); //el método read3() es el mismo, pero la expresión XPath es diferente
leer5();
}
publicstaticvoidread1(){
/*
*uselocal-name()ynamespace-uri()enXPath
*/
intentar{
longstartTime=System.currentTimeMillis();
SAXReaderreader=nuevoSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.read(en);
/*Stringxpath="//*[local-name()='Workbook'andnamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[nombre-local()='Hoja de trabajo']"
+"/*[nombre-local()='Tabla']"
+"/*[nombre-local()='Fila'][4]"
+"/*[nombre-local()='Celda'][3]"
+"/*[nombre-local()='Datos'][1]";*/
Stringxpath="//*[local-name()='Fila'][4]/*[local-name()='Celda'][3]/*[local-name()='Datos'][ 1]";
System.err.println("======uselocal-name()andnamespace-uri()inXPath====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("sin marcar")
Lista<Elemento>list=doc.selectNodes(xpath);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("mostrar="+mostrar);
longendTime=System.currentTimeMillis();
System.out.println("Tiempo de ejecución del programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentoExcepción){
e.printStackTrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURIs)
*/
intentar{
longstartTime=System.currentTimeMillis();
MapaMapa=newHashMap();
map.put("Libro de trabajo","urna:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=nuevoSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.read(en);
Stringxpath="//Libro de trabajo:Fila[4]/Libro de trabajo:Celda[3]/Libro de trabajo:Datos[1]";
System.err.println("======usesetNamespaceURIs()tosetxpathnamespace====");
System.err.println("XPath:"+xpath);
XPathx=doc.createXPath(xpath);
x.setNamespaceURIs(mapa);
@SuppressWarnings("sin marcar")
Lista<Elemento>list=x.selectNodes(doc);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("mostrar="+mostrar);
longendTime=System.currentTimeMillis();
System.out.println("Tiempo de ejecución del programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentoExcepción){
e.printStackTrace();
}
}
publicstaticvoidread3(){
/*
*setDocumentFactory()espacio de nombres(setXPathNamespaceURIs)
*/
intentar{
longstartTime=System.currentTimeMillis();
MapaMapa=newHashMap();
map.put("Libro de trabajo","urna:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=nuevoSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
lector.getDocumentFactory().setXPathNamespaceURIs(mapa);
Documentdoc=reader.read(en);
Stringxpath="//Libro de trabajo:Fila[4]/Libro de trabajo:Celda[3]/Libro de trabajo:Datos[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("sin marcar")
Lista<Elemento>list=doc.selectNodes(xpath);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("mostrar="+mostrar);
longendTime=System.currentTimeMillis();
System.out.println("Tiempo de ejecución del programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentoExcepción){
e.printStackTrace();
}
}
publicstaticvoidread4(){
/*
*Igual que el método read3(), pero la expresión XPath es diferente
*/
intentar{
longstartTime=System.currentTimeMillis();
MapaMapa=newHashMap();
map.put("Libro de trabajo","urna:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=nuevoSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
lector.getDocumentFactory().setXPathNamespaceURIs(mapa);
Documentdoc=reader.read(en);
Stringxpath="//Libro de trabajo:Hoja de trabajo/Libro de trabajo:Tabla/Libro de trabajo:Fila[4]/Libro de trabajo:Celda[3]/Libro de trabajo:Datos[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("sin marcar")
Lista<Elemento>list=doc.selectNodes(xpath);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("mostrar="+mostrar);
longendTime=System.currentTimeMillis();
System.out.println("Tiempo de ejecución del programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentoExcepción){
e.printStackTrace();
}
}
publicstaticvoidread5(){
/*
*DOMyXPath
*/
intentar{
longstartTime=System.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware (falso);
DocumentBuilderbuilder=dbf.newDocumentBuilder();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
org.w3c.dom.Documentdoc=builder.parse(en);
XPathFactoryfactory=XPathFactory.newInstance();
javax.xml.xpath.XPathx=factory.newXPath();
//Selecciona el atributo de nombre de todos los elementos de clase.
Stringxpath="//Libro de trabajo/Hoja de trabajo/Tabla/Fila[4]/Celda[3]/Datos[1]";
System.err.println("======DomXPath====");
System.err.println("XPath:"+xpath);
XPathExpressionexpr=x.compile(xpath);
NodeListnodes=(NodeList)expr.evaluate(doc,XPathConstants.NODE);
for(inti=0;i<nodos.getLength();i++){
System.out.println("show="+nodes.item(i).getNodeValue());
longendTime=System.currentTimeMillis();
System.out.println("Tiempo de ejecución del programa:"+(endTime-startTime)+"ms");
}
}catch(XPathExpressionExceptione){
e.printStackTrace();
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
PD: Aquí hay varias herramientas en línea para operaciones xml para su referencia:
Herramienta de conversión XML/JSON en línea:
http://tools.VeVB.COm/code/xmljson
Formato en línea XML/compresión XML en línea:
http://tools.VeVB.COm/code/xmlformat
Herramienta de formato/compresión XML en línea:
http://tools.VeVB.COm/code/xml_format_compress