1 4 Möglichkeiten zum Parsen von XML-Dateien
Es gibt vier klassische Methoden zum Parsen von XML-Dateien. Es gibt zwei grundlegende Parsing-Methoden, eine heißt SAX und die andere heißt DOM. SAX basiert auf der Analyse von Ereignisströmen und DOM basiert auf der Analyse der XML-Dokumentbaumstruktur. Auf dieser Grundlage wurde JDOM entwickelt, um den Codierungsaufwand für DOM und SAX zu reduzieren. Sein Vorteil besteht darin, dass das 20-80-Prinzip (Pareto-Prinzip) den Codeumfang erheblich reduziert. Unter normalen Umständen wird JDOM verwendet, um die einfachen zu implementierenden Funktionen wie Parsen, Erstellen usw. zu erfüllen. Aber auf der untersten Ebene verwendet JDOM immer noch SAX-Dokumente (am häufigsten verwendet), DOM und Xanan-Dokumente. Die andere ist DOM4J, eine sehr, sehr hervorragende Java-XML-API mit hervorragender Leistung, leistungsstarken Funktionen und extremer Benutzerfreundlichkeit. Außerdem handelt es sich um eine Open-Source-Software. Heutzutage kann man sehen, dass immer mehr Java-Software DOM4J zum Lesen und Schreiben von XML verwendet. Besonders erwähnenswert ist, dass sogar Suns JAXM auch DOM4J verwendet. Informationen zur spezifischen Verwendung der vier Methoden finden Sie in Baidu. Dort finden Sie viele detaillierte Einführungen.
2 Eine kurze Einführung in XPath
XPath ist eine Sprache zum Auffinden von Informationen in XML-Dokumenten. XPath wird verwendet, um durch Elemente und Attribute in XML-Dokumenten zu navigieren und Elemente und Attribute zu durchlaufen. XPath ist ein Hauptelement des W3C XSLT-Standards und sowohl XQuery als auch XPointer basieren auf XPath-Ausdrücken. Daher ist ein Verständnis von XPath die Grundlage für viele fortgeschrittene XML-Anwendungen. XPath ist der SQL-Sprache für Datenbankoperationen oder JQuery sehr ähnlich, was es Entwicklern erleichtert, das zu finden, was sie im Dokument benötigen. DOM4J unterstützt auch die Verwendung von XPath.
3 DOM4J mit XPath
Wenn DOM4J XPath zum Parsen von XML-Dokumenten verwendet, müssen Sie zunächst auf zwei JAR-Pakete im Projekt verweisen:
dom4j-1.6.1.jar: DOM4J-Softwarepaket, Download-Adresse http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar: Wenn dieses Paket nicht hinzugefügt wird, wird normalerweise eine Ausnahme ausgelöst (java.lang.NoClassDefFoundError: org/jaxen/JaxenException). Die Download-Adresse lautet http://www.jaxen.org/releases .html.
3.1 Interferenz des Namensraums
Bei der Verarbeitung von XML-Dateien, die aus Excel-Dateien oder anderen Formatdateien konvertiert wurden, stoßen wir häufig auf Situationen, in denen durch die XPath-Analyse keine Ergebnisse erzielt werden können. Diese Situation wird normalerweise durch die Existenz von Namespaces verursacht. Nehmen wir als Beispiel die XML-Datei mit dem folgenden Inhalt: Wenn Sie eine einfache Suche über XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] " durchführen, erhalten Sie normalerweise keine Ergebnisse erscheinen. Dies wird durch den Namespace (xmlns="urn:schemas-microsoft-com:office:spreadsheet") verursacht.
Kopieren Sie den Codecode wie folgt:
<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:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<Arbeitsblatt ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
<Row ss:AutoFitHeight="0">
<Zelle>
<Data ss:Type="String">Codetypisierende Ratte</Data>
</Cell>
</Zeile>
<Row ss:AutoFitHeight="0">
<Zelle>
<Data ss:Type="String">Sunny</Data>
</Cell>
</Zeile>
</Tabelle>
</Arbeitsblatt>
</Arbeitsmappe>
3.2 XPath analysiert XML-Dateien mit Namespaces
Die erste Methode (Funktion read1()): Verwenden Sie local-name() und namespace-uri(), die in der XPath-Syntax enthalten sind, um den Knotennamen und Namespace anzugeben, den Sie verwenden möchten. Das Schreiben von XPath-Ausdrücken ist schwieriger.
Die zweite Methode (Funktion read2()): Legen Sie den XPath-Namespace fest und verwenden Sie die Funktion setNamespaceURIs().
Die dritte Methode (Funktion read3()): Legen Sie den Namespace von DocumentFactory() fest, die verwendete Funktion ist setXPathNamespaceURIs(). Das Schreiben von XPath-Ausdrücken in den Methoden zwei und drei ist relativ einfach.
Die vierte Methode (read4()-Funktion): Die Methode ist die gleiche wie die dritte Methode, aber der XPath-Ausdruck ist anders (speziell im Programm reflektiert). Sie dient hauptsächlich dazu, den Unterschied im XPath-Ausdruck zu testen und sich hauptsächlich auf die Vollständigkeit zu beziehen und ob es Auswirkungen auf die Abrufeffizienz hat.
(Die oben genannten vier Methoden verwenden alle DOM4J in Kombination mit XPath, um XML-Dateien zu analysieren.)
Die fünfte Methode (Funktion read5()): Verwenden Sie DOM in Kombination mit XPath, um die XML-Datei zu analysieren, hauptsächlich um den Leistungsunterschied zu testen.
Nichts sagt mehr als Code! Kodieren Sie entscheidend!
Kopieren Sie den Codecode wie folgt:
packageXPath;
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;
/**
*DOM4JDOMXMLXPath
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
read1();
read2();
read3();
Die Methode read4(); //read3() ist dieselbe, der XPath-Ausdruck ist jedoch unterschiedlich
read5();
}
publicstaticvoidread1(){
/*
*uselocal-name()andnamespace-uri()inXPath
*/
versuchen{
longstartTime=System.currentTimeMillis();
SAXReaderreader=newSAXReader();
InputStreamin=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()='Worksheet']"
+"/*[local-name()='Table']"
+"/*[local-name()='Row'][4]"
+"/*[local-name()='Cell'][3]"
+"/*[local-name()='Data'][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("ungeprüft")
List<Element>list=doc.selectNodes(xpath);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Programmlaufzeit:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURIs)
*/
versuchen{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=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("ungeprüft")
List<Element>list=x.selectNodes(doc);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Programmlaufzeit:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread3(){
/*
*setDocumentFactory()namespace(setXPathNamespaceURIs)
*/
versuchen{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=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("ungeprüft")
List<Element>list=doc.selectNodes(xpath);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Programmlaufzeit:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread4(){
/*
*Wie die Methode read3(), aber der XPath-Ausdruck ist anders
*/
versuchen{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
map.put("Workbook","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=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("ungeprüft")
List<Element>list=doc.selectNodes(xpath);
for(Objecto:list){
Elemente=(Element)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("Programmlaufzeit:"+(endTime-startTime)+"ms");
}
}catch(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread5(){
/*
*DOMandXPath
*/
versuchen{
longstartTime=System.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
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();
//Wählen Sie das Namensattribut aller Klassenelemente aus
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);
for(inti=0;i<nodes.getLength();i++){
System.out.println("show="+nodes.item(i).getNodeValue());
longendTime=System.currentTimeMillis();
System.out.println("Programmlaufzeit:"+(endTime-startTime)+"ms");
}
}catch(XPathExpressionExceptione){
e.printStackTrace();
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
PS: Hier sind mehrere Online-Tools für XML-Operationen als Referenz:
Online-XML/JSON-Konvertierungstool:
http://tools.VeVB.COm/code/xmljson
Online-Formatierung von XML/Online-Komprimierung von XML:
http://tools.VeVB.COm/code/xmlformat
XML-Online-Komprimierungs-/Formatierungstool:
http://tools.VeVB.COm/code/xml_format_compress