1 4 façons d'analyser les fichiers XML
Il existe quatre méthodes classiques pour analyser les fichiers XML. Il existe deux méthodes d'analyse de base, l'une s'appelle SAX et l'autre s'appelle DOM. SAX est basé sur l'analyse de flux d'événements et DOM est basé sur l'analyse de la structure arborescente des documents XML. Sur cette base, afin de réduire la quantité de codage pour DOM et SAX, JDOM est apparu. Son avantage est que le principe 20-80 (principe de Pareto) réduit considérablement la quantité de code. Dans des circonstances normales, JDOM est utilisé pour répondre aux fonctions simples à implémenter, telles que l'analyse, la création, etc. Mais au niveau inférieur, JDOM utilise toujours les documents SAX (le plus couramment utilisé), DOM et Xanan. L'autre est DOM4J, qui est une très, très excellente API Java XML avec d'excellentes performances, des fonctions puissantes et une extrême facilité d'utilisation. De nos jours, vous pouvez constater que de plus en plus de logiciels Java utilisent DOM4J pour lire et écrire du XML. Il convient particulièrement de mentionner que même JAXM de Sun utilise également DOM4J. Pour l'utilisation spécifique des quatre méthodes, recherchez Baidu et il y aura de nombreuses introductions détaillées.
2 Une brève introduction à XPath
XPath est un langage permettant de rechercher des informations dans des documents XML. XPath est utilisé pour parcourir les éléments et les attributs dans les documents XML, ainsi que pour parcourir les éléments et les attributs. XPath est un élément majeur de la norme XSLT du W3C, et XQuery et XPointer sont construits sur des expressions XPath. Par conséquent, la compréhension de XPath constitue la base de nombreuses applications XML avancées. XPath est très similaire au langage SQL pour les opérations de base de données, ou JQuery, ce qui permet aux développeurs de récupérer facilement ce dont ils ont besoin dans le document. DOM4J prend également en charge l'utilisation de XPath.
3 DOM4J utilisant XPath
Lorsque DOM4J utilise XPath pour analyser des documents XML, vous devez d'abord référencer deux packages JAR dans le projet :
dom4j-1.6.1.jar : progiciel DOM4J, adresse de téléchargement http://sourceforge.net/projects/dom4j/ ;
jaxen-xx.xx.jar : généralement, si ce package n'est pas ajouté, une exception sera levée (java.lang.NoClassDefFoundError : org/jaxen/JaxenException). L'adresse de téléchargement est http://www.jaxen.org/releases. .html.
3.1 Interférence de l'espace de noms
Lors du traitement de fichiers XML convertis à partir de fichiers Excel ou d'autres formats de fichiers, nous rencontrons souvent des situations dans lesquelles aucun résultat ne peut être obtenu grâce à l'analyse XPath. Cette situation est généralement due à l'existence d'espaces de noms. En prenant le fichier XML avec le contenu suivant comme exemple, si vous effectuez une simple recherche via XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] ", aucun résultat ne sera généralement obtenu. apparaître. Cela est dû à l'espace de noms (xmlns="urn:schemas-microsoft-com:office:spreadsheet").
Copiez le code comme suit :
<Classeur 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:feuille de calcul" xmlns:html="http://www.w3.org/TR/REC-html40">
<Feuille de calcul ss:Name="Feuille1">
<Table ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
<Ligne ss:AutoFitHeight="0">
<Cellule>
<Data ss:Type="String">Rat typateur de code</Data>
</Cellule>
</Rangée>
<Ligne ss:AutoFitHeight="0">
<Cellule>
<Data ss:Type="String">Ensoleillé</Data>
</Cellule>
</Rangée>
</Table>
</Feuille de travail>
</Classeur>
3.2 XPath analysant les fichiers XML avec des espaces de noms
La première méthode (fonction read1()) : utilisez les éléments local-name() et namespace-uri() fournis avec la syntaxe XPath pour spécifier le nom du nœud et l'espace de noms que vous souhaitez utiliser. L'écriture d'expressions XPath est plus compliquée.
La deuxième méthode (fonction read2()) : définissez l'espace de noms XPath et utilisez la fonction setNamespaceURIs().
La troisième méthode (fonction read3()) : définit l'espace de noms de DocumentFactory(), la fonction utilisée est setXPathNamespaceURIs(). L'écriture d'expressions XPath dans les méthodes deux et trois est relativement simple.
La quatrième méthode (fonction read4()) : la méthode est la même que la troisième méthode, mais l'expression XPath est différente (spécifiquement reflétée dans le programme). Il s'agit principalement de tester la différence dans l'expression XPath, se référant principalement à l'exhaustivité). , et si cela affectera l'efficacité de la récupération.
(Les quatre méthodes ci-dessus utilisent toutes DOM4J combinées à XPath pour analyser les fichiers XML)
La cinquième méthode (fonction read5()) : utilisez DOM combiné avec XPath pour analyser le fichier XML, principalement pour tester la différence de performances.
Rien n'est plus parlant que le code ! Codez de manière décisive !
Copiez le code comme suit :
paquetXPath ;
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.Document ;
importorg.dom4j.DocumentException ;
importorg.dom4j.Element ;
importorg.dom4j.XPath ;
importorg.dom4j.io.SAXReader ;
importorg.w3c.dom.NodeList ;
importorg.xml.sax.SAXException ;
/**
*DOM4JDOMXMLXChemin
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
lire1();
read2();
read3();
read4(); //read3() est la même, mais l'expression XPath est différente
lire5();
}
publicstaticvoidread1(){
/*
*utilisez le nom local() et l'espace de noms-uri() dans XPath
*/
essayer{
longstartTime=System.currentTimeMillis();
SAXReaderreader=nouveauSAXReader();
InputStream=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.read(in);
/*Stringxpath="//*[local-name()='Workbook'andnamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[local-name()='Feuille de travail']"
+"/*[nom-local()='Table']"
+"/*[local-name()='Ligne'][4]"
+"/*[nom-local()='Cellule'][3]"
+"/*[local-name()='Données'][1]";*/
Stringxpath="//*[local-name()='Row'][4]/*[local-name()='Cell'][3]/*[local-name()='Data'][ 1]";
System.err.println("======uselocal-name()andnamespace-uri()inXPath====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("non coché")
List<Element>list=doc.selectNodes(xpath);
pour(Objet:liste){
Élément=(Élément)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Durée d'exécution du programme :"+(endTime-startTime)+"ms");
}
}catch(DocumentException){
e.printStackTrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURI)
*/
essayer{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Classeur","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=nouveauSAXReader();
InputStream=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.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(map);
@SuppressWarnings("non coché")
List<Element>list=x.selectNodes(doc);
pour(Objet:liste){
Élément=(Élément)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Durée d'exécution du programme :"+(endTime-startTime)+"ms");
}
}catch(DocumentException){
e.printStackTrace();
}
}
publicstaticvoidread3(){
/*
*setDocumentFactory()espace de noms (setXPathNamespaceURIs)
*/
essayer{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Classeur","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=nouveauSAXReader();
InputStream=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(map);
Documentdoc=reader.read(in);
Stringxpath="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("non coché")
List<Element>list=doc.selectNodes(xpath);
pour(Objet:liste){
Élément=(Élément)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Durée d'exécution du programme :"+(endTime-startTime)+"ms");
}
}catch(DocumentException){
e.printStackTrace();
}
}
publicstaticvoidread4(){
/*
*Identique à la méthode read3(), mais l'expression XPath est différente
*/
essayer{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Classeur","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=nouveauSAXReader();
InputStream=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(map);
Documentdoc=reader.read(in);
Stringxpath="//Workbook:Worksheet/Workbook:Table/Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("non coché")
List<Element>list=doc.selectNodes(xpath);
pour(Objet:liste){
Élément=(Élément)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Durée d'exécution du programme :"+(endTime-startTime)+"ms");
}
}catch(DocumentException){
e.printStackTrace();
}
}
publicstaticvoidread5(){
/*
*DOEtXPath
*/
essayer{
longstartTime=System.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
DocumentBuilderbuilder=dbf.newDocumentBuilder();
InputStream=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
org.w3c.dom.Documentdoc=builder.parse(in);
XPathFactoryfactory=XPathFactory.newInstance();
javax.xml.xpath.XPathx=factory.newXPath();
//Sélectionnez l'attribut name de tous les éléments de classe
Stringxpath="//Workbook/Worksheet/Table/Row[4]/Cell[3]/Data[1]";
System.err.println("======DomXPath====");
System.err.println("XPath:"+xpath);
XPathExpressionexpr=x.compile(xpath);
NodeListnodes=(NodeList)expr.evaluate(doc,XPathConstants.NODE);
pour(inti=0;i<nodes.getLength();i++){
System.out.println("show="+nodes.item(i).getNodeValue());
longendTime=System.currentTimeMillis();
System.out.println("Durée d'exécution du programme :"+(endTime-startTime)+"ms");
}
}catch(XPathExpressionExceptione){
e.printStackTrace();
}catch(ParserConfigurationException){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
PS : Voici plusieurs outils en ligne pour les opérations XML pour votre référence :
Outil de conversion XML/JSON en ligne :
http://tools.VeVB.COm/code/xmljson
Formatage en ligne XML/Compression XML en ligne :
http://tools.VeVB.COm/code/xmlformat
Outil de compression/formatage XML en ligne :
http://tools.VeVB.COm/code/xml_format_compress