1 4 วิธีในการแยกวิเคราะห์ไฟล์ XML
มีสี่วิธีคลาสสิกสำหรับการแยกวิเคราะห์ไฟล์ XML มีสองวิธีพื้นฐานในการแยกวิเคราะห์ วิธีหนึ่งเรียกว่า SAX และอีกวิธีหนึ่งเรียกว่า DOM SAX ขึ้นอยู่กับการแยกวิเคราะห์สตรีมเหตุการณ์ และ DOM ขึ้นอยู่กับการแยกวิเคราะห์โครงสร้างต้นไม้เอกสาร XML บนพื้นฐานนี้ เพื่อลดจำนวนการเข้ารหัสสำหรับ DOM และ SAX JDOM จึงเกิดขึ้น ข้อได้เปรียบของหลักการ 20-80 (หลักการ Pareto) ช่วยลดจำนวนโค้ดได้อย่างมาก ภายใต้สถานการณ์ปกติ JDOM จะถูกใช้เพื่อตอบสนองฟังก์ชันง่ายๆ ที่จะนำไปใช้ เช่น การแยกวิเคราะห์ การสร้าง ฯลฯ แต่ที่ระดับล่างสุด JDOM ยังคงใช้เอกสาร SAX (ที่ใช้กันมากที่สุด), DOM และ Xanan อีกอันหนึ่งคือ DOM4J ซึ่งเป็น Java XML API ที่ยอดเยี่ยมมากพร้อมประสิทธิภาพที่ยอดเยี่ยม ฟังก์ชันที่ทรงพลัง และใช้งานง่ายมาก นอกจากนี้ยังเป็นซอฟต์แวร์โอเพ่นซอร์สอีกด้วย ทุกวันนี้ คุณจะเห็นว่าซอฟต์แวร์ Java ใช้ DOM4J ในการอ่านและเขียน XML มากขึ้นเรื่อยๆ เป็นเรื่องที่น่าสังเกตว่าแม้แต่ JAXM ของ Sun ก็ใช้ DOM4J เช่นกัน สำหรับการใช้งานทั้งสี่วิธีโดยเฉพาะ ให้ค้นหา Baidu และจะมีการแนะนำโดยละเอียดมากมาย
2 ข้อมูลเบื้องต้นเกี่ยวกับ XPath
XPath เป็นภาษาสำหรับค้นหาข้อมูลในเอกสาร XML XPath ใช้เพื่อนำทางผ่านองค์ประกอบและคุณลักษณะในเอกสาร XML และเพื่อสำรวจองค์ประกอบและคุณลักษณะ XPath เป็นองค์ประกอบหลักของมาตรฐาน W3C XSLT และทั้ง XQuery และ XPointer สร้างขึ้นจากนิพจน์ XPath ดังนั้นความเข้าใจ XPath จึงเป็นพื้นฐานสำหรับแอปพลิเคชัน XML ขั้นสูงจำนวนมาก XPath นั้นคล้ายคลึงกับภาษา SQL สำหรับการดำเนินการฐานข้อมูลหรือ JQuery มาก ซึ่งทำให้นักพัฒนาสามารถดึงสิ่งที่ต้องการในเอกสารได้อย่างง่ายดาย DOM4J ยังรองรับการใช้ XPath
3 DOM4J โดยใช้ XPath
เมื่อ DOM4J ใช้ XPath เพื่อแยกวิเคราะห์เอกสาร XML คุณต้องอ้างอิงแพ็คเกจ JAR สองแพ็คเกจในโครงการก่อน:
dom4j-1.6.1.jar: ชุดซอฟต์แวร์ DOM4J ที่อยู่ดาวน์โหลด http://sourceforge.net/projects/dom4j/;
jaxen-xx.xx.jar: โดยปกติหากไม่ได้เพิ่มแพ็คเกจนี้ จะมีข้อยกเว้นเกิดขึ้น (java.lang.NoClassDefFoundError: org/jaxen/JaxenException) ที่อยู่การดาวน์โหลดคือ http://www.jaxen.org/releases .html
3.1 การรบกวนของเนมสเปซ
เมื่อประมวลผลไฟล์ xml ที่แปลงจากไฟล์ Excel หรือไฟล์รูปแบบอื่นๆ เรามักจะพบกับสถานการณ์ที่ไม่สามารถรับผลลัพธ์ได้ผ่านการแยกวิเคราะห์ XPath สถานการณ์นี้มักเกิดจากการมีเนมสเปซอยู่ นำไฟล์ XML ที่มีเนื้อหาต่อไปนี้เป็นตัวอย่าง หากคุณทำการค้นหาแบบง่ายๆ ผ่าน XPath=" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] " โดยปกติแล้วจะไม่มีผลลัพธ์ใดๆ ปรากฏ. สาเหตุนี้มีสาเหตุมาจากเนมสเปซ (xmlns="urn:schemas-microsoft-com:office:spreadsheet")
คัดลอกรหัสรหัสดังต่อไปนี้:
<สมุดงาน 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">
<แผ่นงาน ss:Name="Sheet1">
<ตาราง ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
<แถว ss:AutoFitHeight="0">
<เซลล์>
<Data ss:Type="String">หนูพิมพ์โค้ด</Data>
</เซลล์>
</แถว>
<แถว ss:AutoFitHeight="0">
<เซลล์>
<Data ss:Type="String">ซันนี่</ข้อมูล>
</เซลล์>
</แถว>
</ตาราง>
</แผ่นงาน>
</สมุดงาน>
3.2 XPath แยกวิเคราะห์ไฟล์ xml ด้วยเนมสเปซ
วิธีแรก (ฟังก์ชัน read1()): ใช้ local-name() และ namespace-uri() ที่มาพร้อมกับไวยากรณ์ XPath เพื่อระบุชื่อโหนดและเนมสเปซที่คุณต้องการใช้ การเขียนนิพจน์ XPath นั้นยุ่งยากกว่า
วิธีที่สอง (ฟังก์ชัน read2()): ตั้งค่าเนมสเปซ XPath และใช้ฟังก์ชัน setNamespaceURIs()
วิธีที่สาม (ฟังก์ชัน read3()): ตั้งค่าเนมสเปซของ DocumentFactory() ฟังก์ชันที่ใช้คือ setXPathNamespaceURIs() การเขียนนิพจน์ XPath ในวิธีที่ 2 และ 3 นั้นค่อนข้างง่าย
วิธีที่สี่ (ฟังก์ชัน read4()): วิธีการนี้เหมือนกับวิธีที่สาม แต่นิพจน์ XPath นั้นแตกต่างกัน (สะท้อนให้เห็นโดยเฉพาะในโปรแกรม) มีวัตถุประสงค์หลักเพื่อทดสอบความแตกต่างในนิพจน์ XPath โดยส่วนใหญ่อ้างอิงถึงความสมบูรณ์ และจะส่งผลต่อประสิทธิภาพในการดึงข้อมูลหรือไม่
(สี่วิธีข้างต้นทั้งหมดใช้ DOM4J รวมกับ XPath เพื่อแยกวิเคราะห์ไฟล์ XML)
วิธีที่ห้า (ฟังก์ชัน read5()): ใช้ DOM ร่วมกับ XPath เพื่อแยกไฟล์ XML เพื่อทดสอบความแตกต่างด้านประสิทธิภาพเป็นหลัก
ไม่มีอะไรดังไปกว่าโค้ด! รหัสเด็ดขาด!
คัดลอกรหัสรหัสดังต่อไปนี้:
แพคเกจXPath;
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;
นำเข้าjavax.xml.xpath.XPathExpression;
importjavax.xml.xpath.XPathExpressionException;
นำเข้าjavax.xml.xpath.XPathFactory;
importorg.dom4j.เอกสาร;
importorg.dom4j.DocumentException;
importorg.dom4j.องค์ประกอบ;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
-
*DOM4JDOMXMLXPath
-
คลาสสาธารณะTestDom4jXpath{
publicstaticvoidmain (สตริง [] args) {
อ่าน1();
อ่าน2();
read3();
read4(); //read3() วิธีการเหมือนกัน แต่นิพจน์ XPath แตกต่างกัน
อ่าน5();
-
สาธารณะเป็นโมฆะอ่าน1(){
-
*uselocal-name()andnamespace-uri()inXPath
-
พยายาม{
longstartTime=System.currentTimeMillis();
SAXReaderreader=ใหม่SAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.read(ใน);
/*Stringxpath="//*[local-name()='Workbook'andnamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[ชื่อท้องถิ่น()='แผ่นงาน']"
+"/*[ชื่อท้องถิ่น()='ตาราง']"
+"/*[ชื่อท้องถิ่น()='แถว'][4]"
+"/*[ชื่อท้องถิ่น()='เซลล์'][3]"
+"/*[ชื่อท้องถิ่น()='ข้อมูล'][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("ไม่ได้เลือก")
รายการ <องค์ประกอบ>list=doc.selectNodes(xpath);
สำหรับ (วัตถุ: รายการ) {
องค์ประกอบ=(องค์ประกอบ)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("เวลาทำงานของโปรแกรม:"+(endTime-startTime)+"ms");
-
} จับ (DocumentExceptione){
e.printStackTrace();
-
-
สาธารณะเป็นโมฆะอ่าน2(){
-
*setxpathnamespace(setNamespaceURIs)
-
พยายาม{
longstartTime=System.currentTimeMillis();
แผนที่แผนที่=ใหม่HashMap();
map.put("สมุดงาน", "โกศ:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=ใหม่SAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.read(ใน);
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 (แผนที่);
@SuppressWarnings("ไม่ได้เลือก")
รายการ<องค์ประกอบ>รายการ=x.selectNodes(doc);
สำหรับ (วัตถุ: รายการ) {
องค์ประกอบ=(องค์ประกอบ)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("เวลาทำงานของโปรแกรม:"+(endTime-startTime)+"ms");
-
} จับ (DocumentExceptione){
e.printStackTrace();
-
-
สาธารณะเป็นโมฆะอ่าน3(){
-
*setDocumentFactory()เนมสเปซ(setXPathNamespaceURIs)
-
พยายาม{
longstartTime=System.currentTimeMillis();
แผนที่แผนที่=ใหม่HashMap();
map.put("สมุดงาน", "โกศ:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=ใหม่SAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(แผนที่);
Documentdoc=reader.read(ใน);
Stringxpath="//Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("ไม่ได้เลือก")
รายการ <องค์ประกอบ>list=doc.selectNodes(xpath);
สำหรับ (วัตถุ: รายการ) {
องค์ประกอบ=(องค์ประกอบ)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("เวลาทำงานของโปรแกรม:"+(endTime-startTime)+"ms");
-
} จับ (DocumentExceptione){
e.printStackTrace();
-
-
สาธารณะเป็นโมฆะอ่าน4(){
-
*เหมือนกับเมธอด read3() แต่นิพจน์ XPath นั้นแตกต่างออกไป
-
พยายาม{
longstartTime=System.currentTimeMillis();
แผนที่แผนที่=ใหม่HashMap();
map.put("สมุดงาน", "โกศ:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=ใหม่SAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
reader.getDocumentFactory().setXPathNamespaceURIs(แผนที่);
Documentdoc=reader.read(ใน);
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("ไม่ได้เลือก")
รายการ <องค์ประกอบ>list=doc.selectNodes(xpath);
สำหรับ (วัตถุ: รายการ) {
องค์ประกอบ=(องค์ประกอบ)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("เวลาทำงานของโปรแกรม:"+(endTime-startTime)+"ms");
-
} จับ (DocumentExceptione){
e.printStackTrace();
-
-
สาธารณะเป็นโมฆะอ่าน5() {
-
*DOMandXPath
-
พยายาม{
longstartTime=System.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(เท็จ);
DocumentBuilderbuilder=dbf.newDocumentBuilder();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
org.w3c.dom.Documentdoc=builder.parse(ใน);
XPathFactoryfactory=XPathFactory.newInstance();
javax.xml.xpath.XPathx=factory.newXPath();
//เลือกแอตทริบิวต์ชื่อขององค์ประกอบคลาสทั้งหมด
Stringxpath="//สมุดงาน/แผ่นงาน/ตาราง/แถว[4]/เซลล์[3]/ข้อมูล[1]";
System.err.println("======DomXPath====");
System.err.println("XPath:"+xpath);
XPathExpressionexpr=x.คอมไพล์(xpath);
NodeListnodes=(NodeList)expr.evaluate(doc,XPathConstants.NODE);
สำหรับ(inti=0;i<nodes.getLength();i++){
System.out.println("show="+nodes.item(i).getNodeValue());
longendTime=System.currentTimeMillis();
System.out.println("เวลาทำงานของโปรแกรม:"+(endTime-startTime)+"ms");
-
} จับ (XPathExpressionExceptione){
e.printStackTrace();
} จับ (ParserConfigurationExceptione){
e.printStackTrace();
} จับ (SAXExceptione){
e.printStackTrace();
} จับ (IOExceptione) {
e.printStackTrace();
-
-
-
PS: ต่อไปนี้เป็นเครื่องมือออนไลน์หลายอย่างสำหรับการดำเนินการ xml สำหรับการอ้างอิงของคุณ:
เครื่องมือแปลง XML/JSON ออนไลน์:
http://tools.VeVB.COm/code/xmljson
การจัดรูปแบบออนไลน์ XML/การบีบอัด XML ออนไลน์:
http://tools.VeVB.COm/code/xmlformat
เครื่องมือบีบอัด/จัดรูปแบบ XML ออนไลน์:
http://tools.VeVB.COm/code/xml_format_compress