1 4 cara mengurai file XML
Ada empat metode klasik untuk mengurai file XML. Ada dua metode dasar parsing, yang satu disebut SAX dan yang lainnya disebut DOM. SAX didasarkan pada penguraian aliran peristiwa, dan DOM didasarkan pada penguraian struktur pohon dokumen XML. Atas dasar ini, untuk mengurangi jumlah pengkodean untuk DOM dan SAX, muncul JDOM. Keuntungannya adalah prinsip 20-80 (prinsip Pareto) sangat mengurangi jumlah kode. Dalam keadaan normal, JDOM digunakan untuk memenuhi fungsi-fungsi sederhana yang akan diimplementasikan, seperti parsing, pembuatan, dll. Namun pada level paling bawah, JDOM masih menggunakan dokumen SAX (paling umum digunakan), DOM, dan Xanan. Yang lainnya adalah DOM4J, yang merupakan Java XML API yang sangat, sangat bagus dengan kinerja luar biasa, fungsi yang kuat, dan kemudahan penggunaan yang luar biasa. Saat ini, Anda dapat melihat semakin banyak perangkat lunak Java yang menggunakan DOM4J untuk membaca dan menulis XML. Perlu disebutkan bahwa JAXM milik Sun juga menggunakan DOM4J. Untuk penggunaan khusus keempat metode tersebut, cari di Baidu dan akan ada banyak perkenalan mendetail.
2 Pengenalan singkat tentang XPath
XPath adalah bahasa untuk mencari informasi dalam dokumen XML. XPath digunakan untuk menavigasi elemen dan atribut dalam dokumen XML, dan untuk melintasi elemen dan atribut. XPath adalah elemen utama dari standar W3C XSLT, dan XQuery dan XPointer dibuat berdasarkan ekspresi XPath. Oleh karena itu, pemahaman tentang XPath adalah dasar bagi banyak aplikasi XML tingkat lanjut. XPath sangat mirip dengan bahasa SQL untuk operasi database, atau JQuery, yang memudahkan pengembang untuk mengambil apa yang mereka butuhkan dalam dokumen. DOM4J juga mendukung penggunaan XPath.
3 DOM4J menggunakan XPath
Ketika DOM4J menggunakan XPath untuk mengurai dokumen XML, Anda harus mereferensikan dua paket JAR dalam proyek terlebih dahulu:
dom4j-1.6.1.jar: paket perangkat lunak DOM4J, alamat unduhan http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar: Biasanya jika paket ini tidak ditambahkan, pengecualian akan diberikan (java.lang.NoClassDefFoundError: org/jaxen/JaxenException). Alamat unduhannya adalah http://www.jaxen.org/releases .html.
3.1 Interferensi namespace
Saat memproses file xml yang dikonversi dari file excel atau file format lain, kita sering menghadapi situasi di mana tidak ada hasil yang dapat diperoleh melalui penguraian XPath. Keadaan ini biasanya disebabkan oleh adanya namespace. Mengambil file XML dengan konten berikut sebagai contoh, jika Anda melakukan pencarian sederhana melalui XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] ", biasanya tidak ada hasil muncul. Hal ini disebabkan oleh namespace (xmlns="urn:schemas-microsoft-com:office:spreadsheet").
Copy kode kodenya sebagai berikut:
<Buku Kerja 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">
<Lembar Kerja ss:Nama="Lembar1">
>
<Baris ss:AutoFitHeight="0">
<Sel>
<Data ss:Type="String">Tikus pengetik kode</Data>
</Sel>
</Baris>
<Baris ss:AutoFitHeight="0">
<Sel>
<Data ss:Type="String">Cerah</Data>
</Sel>
</Baris>
</Tabel>
</Lembar Kerja>
</Buku Kerja>
3.2 XPath mengurai file xml dengan namespace
Metode pertama (fungsi read1()): Gunakan local-name() dan namespace-uri() yang disertakan dengan sintaks XPath untuk menentukan nama node dan namespace yang ingin Anda gunakan. Menulis ekspresi XPath lebih merepotkan.
Metode kedua (fungsi read2()): Tetapkan namespace XPath dan gunakan fungsi setNamespaceURIs().
Metode ketiga (fungsi read3()): Atur namespace DocumentFactory(), fungsi yang digunakan adalah setXPathNamespaceURIs(). Menulis ekspresi XPath dalam metode dua dan tiga relatif sederhana.
Metode keempat (fungsi read4()): Metode ini sama dengan metode ketiga, tetapi ekspresi XPath berbeda (khususnya tercermin dalam program). , dan apakah itu akan mempengaruhi efisiensi pengambilan.
(Empat metode di atas semuanya menggunakan DOM4J yang dikombinasikan dengan XPath untuk mengurai file XML)
Metode kelima (fungsi read5()): Gunakan DOM yang dikombinasikan dengan XPath untuk mengurai file XML, terutama untuk menguji perbedaan kinerja.
Tidak ada yang berbicara lebih keras daripada kode! Kode dengan tegas!
Copy kode kodenya sebagai berikut:
paketXPath;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.HashMap;
importjava.util.Daftar;
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.Dokumen;
importorg.dom4j.DocumentException;
importorg.dom4j.Element;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
/**
*Jalur DOM4JDOMXMLX
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
baca1();
baca2();
baca3();
read4(); //read3() metodenya sama, tetapi ekspresi XPath berbeda
baca5();
}
publicstaticvoidread1(){
/*
*gunakannama-lokal()dannamespace-uri()diXPath
*/
mencoba{
longstartTime=Sistem.currentTimeMillis();
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=pembaca.baca(dalam);
/*Stringxpath="//*[nama-lokal()='Buku Kerja'dannamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[nama-lokal()='Lembar Kerja']"
+"/*[nama-lokal()='Tabel']"
+"/*[nama-lokal()='Baris'][4]"
+"/*[nama-lokal()='Sel'][3]"
+"/*[nama-lokal()='Data'][1]";*/
Stringxpath="//*[nama-lokal()='Baris'][4]/*[nama-lokal()='Sel'][3]/*[nama-lokal()='Data'][ 1]";
System.err.println("======uselocal-name()andnamespace-uri()inXPath====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("tidak dicentang")
Daftar<Elemen>daftar=doc.selectNodes(xpath);
untuk(Objek:daftar){
Elemen=(Elemen)o;
Stringshow=e.getStringValue();
Sistem.keluar.println("show="+show);
longendTime=Sistem.currentTimeMillis();
System.out.println("Waktu program berjalan:"+(endTime-startTime)+"ms");
}
}menangkap(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURI)
*/
mencoba{
longstartTime=Sistem.currentTimeMillis();
Peta Peta=newHashMap();
map.put("Buku Kerja","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=pembaca.baca(dalam);
Stringxpath="//Buku Kerja:Baris[4]/Buku Kerja:Sel[3]/Buku Kerja:Data[1]";
System.err.println("======usesetNamespaceURIs()tosetxpathnamespace====");
System.err.println("XPath:"+xpath);
XPathx=doc.createXPath(xpath);
x.setNamespaceURI(peta);
@SuppressWarnings("tidak dicentang")
Daftar<Elemen>daftar=x.selectNodes(doc);
untuk(Objek:daftar){
Elemen=(Elemen)o;
Stringshow=e.getStringValue();
Sistem.keluar.println("show="+show);
longendTime=Sistem.currentTimeMillis();
System.out.println("Waktu program berjalan:"+(endTime-startTime)+"ms");
}
}menangkap(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread3(){
/*
*setDocumentFactory()namespace(setXPathNamespaceURI)
*/
mencoba{
longstartTime=Sistem.currentTimeMillis();
Peta Peta=newHashMap();
map.put("Buku Kerja","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(peta);
Documentdoc=pembaca.baca(dalam);
Stringxpath="//Buku Kerja:Baris[4]/Buku Kerja:Sel[3]/Buku Kerja:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("tidak dicentang")
Daftar<Elemen>daftar=doc.selectNodes(xpath);
untuk(Objek:daftar){
Elemen=(Elemen)o;
Stringshow=e.getStringValue();
Sistem.keluar.println("show="+show);
longendTime=Sistem.currentTimeMillis();
System.out.println("Waktu program berjalan:"+(endTime-startTime)+"ms");
}
}menangkap(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread4(){
/*
*Sama seperti metode read3(), tetapi ekspresi XPath berbeda
*/
mencoba{
longstartTime=Sistem.currentTimeMillis();
Peta Peta=newHashMap();
map.put("Buku Kerja","urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(peta);
Documentdoc=pembaca.baca(dalam);
Stringxpath="//Buku Kerja:Lembar Kerja/Buku Kerja:Tabel/Buku Kerja:Baris[4]/Buku Kerja:Sel[3]/Buku Kerja:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("tidak dicentang")
Daftar<Elemen>daftar=doc.selectNodes(xpath);
untuk(Objek:daftar){
Elemen=(Elemen)o;
Stringshow=e.getStringValue();
Sistem.keluar.println("show="+show);
longendTime=Sistem.currentTimeMillis();
System.out.println("Waktu program berjalan:"+(endTime-startTime)+"ms");
}
}menangkap(DocumentExceptione){
e.printStackTrace();
}
}
publicstaticvoidread5(){
/*
*DOMandXPath
*/
mencoba{
longstartTime=Sistem.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(salah);
DocumentBuilderbuilder=dbf.newDocumentBuilder();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
org.w3c.dom.Documentdoc=builder.parse(dalam);
XPathFactoryfactory=XPathFactory.newInstance();
javax.xml.xpath.XPathx=pabrik.newXPath();
//Pilih atribut nama semua elemen kelas
Stringxpath="//Buku Kerja/Lembar Kerja/Tabel/Baris[4]/Sel[3]/Data[1]";
Sistem.err.println("======DomXPath====");
System.err.println("XPath:"+xpath);
XPathExpressionexpr=x.kompilasi(xpath);
NodeListnodes=(NodeList)expr.evaluate(doc,XPathConstants.NODE);
for(inti=0;i<nodes.getLength();i++){
Sistem.keluar.println("show="+nodes.item(i).getNodeValue());
longendTime=Sistem.currentTimeMillis();
System.out.println("Waktu program berjalan:"+(endTime-startTime)+"ms");
}
}menangkap(XPathExpressionExceptione){
e.printStackTrace();
}menangkap(ParserConfigurationExceptione){
e.printStackTrace();
}menangkap(SAXException){
e.printStackTrace();
}menangkap(IOException){
e.printStackTrace();
}
}
}
PS: Berikut beberapa alat online untuk operasi xml untuk referensi Anda:
Alat konversi XML/JSON online:
http://tools.VeVB.COM/code/xmljson
XML pemformatan online/XML kompresi online:
http://tools.VeVB.COM/code/xmlformat
Alat kompresi/pemformatan online XML:
http://tools.VeVB.COm/code/xml_format_compress