1 4 maneiras de analisar arquivos XML
Existem quatro métodos clássicos para analisar arquivos XML. Existem dois métodos básicos de análise, um é chamado SAX e o outro é chamado DOM. SAX é baseado na análise de fluxo de eventos e DOM é baseado na análise de estrutura de árvore de documentos XML. Com base nisso, para reduzir a quantidade de codificação para DOM e SAX, surgiu o JDOM. Sua vantagem é que o princípio 20-80 (princípio de Pareto) reduz bastante a quantidade de código. Em circunstâncias normais, o JDOM é usado para atender às funções simples a serem implementadas, como análise, criação, etc. Mas no nível inferior, o JDOM ainda usa documentos SAX (mais comumente usados), DOM e Xanan. O outro é o DOM4J, que é uma API Java XML muito, muito excelente, com excelente desempenho, funções poderosas e extrema facilidade de uso. Hoje em dia, você pode ver que cada vez mais software Java está usando DOM4J para ler e escrever XML. Vale a pena mencionar que até mesmo o JAXM da Sun também está usando DOM4J. Para o uso específico dos quatro métodos, pesquise no Baidu e haverá muitas introduções detalhadas.
2 Uma breve introdução ao XPath
XPath é uma linguagem para localizar informações em documentos XML. XPath é usado para navegar por elementos e atributos em documentos XML e para percorrer elementos e atributos. XPath é um elemento importante do padrão XSLT W3C, e tanto XQuery quanto XPointer são construídos em expressões XPath. Portanto, uma compreensão do XPath é a base para muitos aplicativos XML avançados. XPath é muito semelhante à linguagem SQL para operações de banco de dados, ou JQuery, o que torna mais fácil para os desenvolvedores obterem o que precisam no documento. DOM4J também suporta o uso de XPath.
3 DOM4J usando XPath
Quando DOM4J usa XPath para analisar documentos XML, primeiro você precisa fazer referência a dois pacotes JAR no projeto:
dom4j-1.6.1.jar: pacote de software DOM4J, endereço de download http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar: Normalmente, se este pacote não for adicionado, uma exceção será lançada (java.lang.NoClassDefFoundError: org/jaxen/JaxenException O endereço de download é http://www.jaxen.org/releases). .html.
3.1 Interferência de namespace
Ao processar arquivos xml convertidos de arquivos Excel ou outros arquivos de formato, frequentemente encontramos situações em que nenhum resultado pode ser obtido por meio da análise XPath. Esta situação geralmente é causada pela existência de namespaces. Tomando como exemplo o arquivo XML com o seguinte conteúdo, se você realizar uma pesquisa simples através de XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] ", normalmente nenhum resultado será aparecer. Isso é causado pelo namespace (xmlns="urn:schemas-microsoft-com:office:spreadsheet").
Copie o código do código da seguinte forma:
<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="urn:schemas-microsoft-com:office:planilha" xmlns:html="http://www.w3.org/TR/REC-html40">
<Planilha ss:Nome="Planilha1">
<Tabela ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
<Linha ss:AutoFitHeight="0">
<Célula>
<Data ss:Type="String">Rato de digitação de código</Data>
</Célula>
</Linha>
<Linha ss:AutoFitHeight="0">
<Célula>
<Data ss:Type="String">Ensolarado</Data>
</Célula>
</Linha>
</Tabela>
</planilha>
</Pasta de trabalho>
3.2 XPath analisando arquivos xml com namespaces
O primeiro método (função read1()): Use local-name() e namespace-uri() que vêm com a sintaxe XPath para especificar o nome do nó e o namespace que você deseja usar. Escrever expressões XPath é mais problemático.
O segundo método (função read2()): Defina o namespace XPath e use a função setNamespaceURIs().
O terceiro método (função read3()): Defina o namespace de DocumentFactory(), a função usada é setXPathNamespaceURIs(). Escrever expressões XPath nos métodos dois e três é relativamente simples.
O quarto método (função read4()): O método é igual ao terceiro método, mas a expressão XPath é diferente (refletida especificamente no programa. É principalmente para testar a diferença na expressão XPath, referindo-se principalmente à integridade). e se isso afetará a eficiência da recuperação.
(Todos os quatro métodos acima usam DOM4J combinado com XPath para analisar arquivos XML)
O quinto método (função read5()): Use DOM combinado com XPath para analisar o arquivo XML, principalmente para testar a diferença de desempenho.
Nada fala mais alto que o código! Codifique decisivamente!
Copie o código do código da seguinte forma:
pacoteXPath;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.HashMap;
importjava.util.List;
importjava.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.Element;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
/**
*DOM4JDOMXMLXCaminho
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
leia1();
leia2();
leia3();
O método read4(); //read3() é o mesmo, mas a expressão XPath é diferente
leia5();
}
publicstaticvoidread1(){
/*
*use nome local() e namespace-uri() no XPath
*/
tentar{
longstartTime=System.currentTimeMillis();
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=leitor.read(in);
/*Stringxpath="//*[local-name()='Workbook'andnamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[nome-local()='Planilha']"
+"/*[nome-local()='Tabela']"
+"/*[nome-local()='Linha'][4]"
+"/*[nome-local()='Célula'][3]"
+"/*[nome-local()='Dados'][1]";*/
Stringxpath="//*[nome-local()='Linha'][4]/*[nome-local()='Célula'][3]/*[nome-local()='Dados'][ 1]";
System.err.println("======uselocal-name()andnamespace-uri()inXPath====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("desmarcado")
List<Element>list=doc.selectNodes(xpath);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Tempo de execução do programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURIs)
*/
tentar{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Pasta de trabalho","urna:schemas-microsoft-com:office:planilha");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=leitor.read(in);
Stringxpath="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetNamespaceURIs()tosetxpathnamespace====");
System.err.println("XPath:"+xpath);
XPathx=doc.createXPath(xpath);
x.setNamespaceURIs(mapa);
@SuppressWarnings("desmarcado")
List<Element>list=x.selectNodes(doc);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Tempo de execução do programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread3(){
/*
*setDocumentFactory()namespace(setXPathNamespaceURIs)
*/
tentar{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Pasta de trabalho","urna:schemas-microsoft-com:office:planilha");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
leitor.getDocumentFactory().setXPathNamespaceURIs(mapa);
Documentdoc=leitor.read(in);
Stringxpath="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("desmarcado")
List<Element>list=doc.selectNodes(xpath);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Tempo de execução do programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread4(){
/*
*Igual ao método read3(), mas a expressão XPath é diferente
*/
tentar{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Pasta de trabalho","urna:schemas-microsoft-com:office:planilha");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
leitor.getDocumentFactory().setXPathNamespaceURIs(mapa);
Documentdoc=leitor.read(in);
Stringxpath="//Workbook:Workbook/Workbook:Table/Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("desmarcado")
List<Element>list=doc.selectNodes(xpath);
for(Objeto:lista){
Elemento=(Elemento)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Tempo de execução do programa:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread5(){
/*
*DOMeXPath
*/
tentar{
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(in);
XPathFactoryfactory=XPathFactory.newInstance();
javax.xml.xpath.XPathx=factory.newXPath();
//Selecione o atributo name de todos os elementos da classe
Stringxpath="//Pasta de trabalho/Planilha/Tabela/Linha[4]/Célula[3]/Dados[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<nodes.getLength();i++){
System.out.println("show="+nodes.item(i).getNodeValue());
longendTime=System.currentTimeMillis();
System.out.println("Tempo de execução do programa:"+(endTime-startTime)+"ms");
}
}catch(XPathExpressionExceptione){
e.printStackTrace();
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
PS: Aqui estão várias ferramentas online para operações XML para sua referência:
Ferramenta online de conversão XML/JSON:
http://tools.VeVB.COm/code/xmljson
Formatação on-line de XML/Compactação de XML on-line:
http://tools.VeVB.COm/code/xmlformat
Ferramenta de compactação/formatação XML online:
http://tools.VeVB.COm/code/xml_format_compress