1. ความรู้พื้นฐาน:
โดยทั่วไปมีสี่วิธีสำหรับ Java เพื่อแยกวิเคราะห์ XML: DOM, SAX, JDOM และ DOM4J
2. ความรู้เบื้องต้นเกี่ยวกับการใช้งาน
1) พระ
(1) บทนำ
อินเทอร์เฟซที่จัดทำโดย W3C (org.w3c.dom) อ่านเอกสาร XML ทั้งหมดลงในหน่วยความจำและสร้างแผนผัง DOM เพื่อดำเนินการในแต่ละโหนด ข้อดีคือเอกสารทั้งหมดอยู่ในหน่วยความจำเสมอ เราสามารถเข้าถึงโหนดใดๆ ได้ตลอดเวลา และการสำรวจเส้นทางแบบต้นไม้ก็เป็นการดำเนินการที่ค่อนข้างคุ้นเคย ข้อเสียคือ มันใช้หน่วยความจำ และเราต้องรอจนกว่าเอกสารทั้งหมดจะถูกอ่านลงในหน่วยความจำ ก่อนการประมวลผล
(2) โค้ดตัวอย่าง:
คัดลอกรหัสรหัสดังต่อไปนี้:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ราก>
<โทรศัพท์>
<พิมพ์ชื่อ = "โนเกีย">
<ราคา>599</ราคา>
<ตัวดำเนินการ>CMCC</ตัวดำเนินการ>
</ประเภท>
<พิมพ์ชื่อ = "xiaomi">
<ราคา>699</ราคา>
<โอเปอเรเตอร์>ไชน่าเน็ต</โอเปอเรเตอร์>
</ประเภท>
</โทรศัพท์>
</ราก>
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.io.ByteArrayOutputStream;
นำเข้า java.io.File;
นำเข้า java.io.FileOutputStream;
นำเข้า java.io.IOException;
นำเข้า java.io.StringReader;
นำเข้า javax.xml.parsers.DocumentBuilder;
นำเข้า javax.xml.parsers.DocumentBuilderFactory;
นำเข้า javax.xml.parsers.ParserConfigurationException;
นำเข้า javax.xml.transform.Transformer;
นำเข้า javax.xml.transform.TransformerConfigurationException;
นำเข้า javax.xml.transform.TransformerException;
นำเข้า javax.xml.transform.TransformerFactory;
นำเข้า javax.xml.transform.dom.DOMSource;
นำเข้า javax.xml.transform.stream.StreamResult;
นำเข้า org.w3c.dom.Document;
นำเข้า org.w3c.dom.Element;
นำเข้า org.w3c.dom.Node;
นำเข้า org.w3c.dom.NodeList;
นำเข้า org.xml.sax.InputSource;
นำเข้า org.xml.sax.SAXException;
XMLHandler ระดับสาธารณะ {
XMLHandler สาธารณะ () {
-
สตริงสาธารณะ createXML(){
สตริง xmlStr = null;
โรงงาน DocumentBuilderFactory = DocumentBuilderFactory.newInstance();
พยายาม {
ตัวสร้าง DocumentBuilder = โรงงาน newDocumentBuilder();
เอกสารเอกสาร = builder.newDocument();
document.setXmlVersion("1.0");
องค์ประกอบ root = document.createElement("root");
document.appendChild (ราก);
โทรศัพท์องค์ประกอบ = document.createElement ("โทรศัพท์");
องค์ประกอบ nokia = document.createElement("ประเภท");
nokia.setAttribute("ชื่อ", "โนเกีย");
องค์ประกอบ priceNokia = document.createElement("price");
priceNokia.setTextContent("599");
nokia.appendChild(ราคาโนเกีย);
ตัวดำเนินการองค์ประกอบNokia = document.createElement("ตัวดำเนินการ");
ตัวดำเนินการNokia.setTextContent("CMCC");
nokia.appendChild(โอเปอเรเตอร์โนเกีย);
โทรศัพท์ผนวกเด็ก (โนเกีย);
องค์ประกอบ xiaomi = document.createElement("ประเภท");
xiaomi.setAttribute("ชื่อ", "xiaomi");
องค์ประกอบ priceXiaoMi = document.createElement("ราคา");
priceXiaoMi.setTextContent("699");
xiaomi.appendChild(ราคาเสี่ยวมี่);
ตัวดำเนินการองค์ประกอบXiaoMi = document.createElement("ตัวดำเนินการ");
ตัวดำเนินการXiaoMi.setTextContent("ChinaNet");
xiaomi.appendChild(โอเปอเรเตอร์XiaoMi);
โทรศัพท์ผนวกเด็ก (xiaomi);
root.appendChild (โทรศัพท์);
TransformerFactory transFactory = TransformerFactory.newInstance();
หม้อแปลงไฟฟ้า Transformer = transFactory.newTransformer();
DOMSource domSource = DOMSource ใหม่ (เอกสาร);
//ส่งออกสตริง
ByteArrayOutputStream bos = ByteArrayOutputStream ใหม่ ();
transFormer.transform(domSource, StreamResult ใหม่ (bos));
xmlStr = bos.toString();
-
//บันทึกเป็นไฟล์
ไฟล์ไฟล์ = ไฟล์ใหม่ ("TelePhone.xml");
ถ้า(!file.exists()){
ไฟล์. createNewFile();
-
FileOutputStream out = FileOutputStream ใหม่ (ไฟล์);
StreamResult xmlResult = StreamResult ใหม่ (ออก);
transFormer.transform(domSource, xmlResult);
-
} จับ (ParserConfigurationException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (TransformerConfigurationException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (TransformerException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
กลับ xmlStr;
-
parserXML โมฆะสาธารณะ (สตริง strXML) {
โรงงาน DocumentBuilderFactory = DocumentBuilderFactory.newInstance();
พยายาม {
ตัวสร้าง DocumentBuilder = โรงงาน newDocumentBuilder();
StringReader sr = StringReader ใหม่ (strXML);
InputSource คือ = InputSource ใหม่ (sr);
เอกสาร doc = builder.parse(is);
องค์ประกอบ rootElement = doc.getDocumentElement();
โทรศัพท์ NodeList = rootElement.getElementsByTagName("type");
สำหรับ (int i = 0; i < phone.getLength(); i++) {
ประเภทโหนด = phone.item (i);
สตริง phoneName = ((องค์ประกอบ) ประเภท).getAttribute("ชื่อ");
System.out.println("หมายเลขโทรศัพท์ = "+phoneName);
คุณสมบัติ NodeList = type.getChildNodes();
สำหรับ (int j = 0; j < properties.getLength(); j++) {
คุณสมบัติโหนด = properties.item(j);
สตริง nodeName = property.getNodeName();
ถ้า (nodeName.equals("ราคา")) {
ราคาสตริง=property.getFirstChild().getNodeValue();
System.out.println("price="+price);
} อื่นถ้า (nodeName.equals("ตัวดำเนินการ")) {
ตัวดำเนินการสตริง=property.getFirstChild().getNodeValue();
System.out.println("ตัวดำเนินการ="+ตัวดำเนินการ);
-
-
-
} จับ (ParserConfigurationException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (SAXException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
โมฆะคงที่สาธารณะ main (String [] args) {
ตัวจัดการ XMLHandler = XMLHandler ใหม่ ();
สตริง xml = handler.createXML();
System.out.println(xml);
ตัวจัดการ parserXML(xml);
-
-
(3) ความแตกต่างระหว่าง Element และ Node (org.w3c.dom)
วัตถุโหนดเป็นประเภทข้อมูลหลักของโมเดลวัตถุเอกสารทั้งหมด เป็นวัตถุพื้นฐานที่สุดใน DOM และแสดงถึงโหนดนามธรรมในแผนผังเอกสาร อย่างไรก็ตาม ในการใช้งานจริง วัตถุ Node จะไม่ค่อยได้ใช้โดยตรง แต่จะใช้องค์ประกอบย่อย Attr ข้อความ ฯลฯ ของวัตถุ Node
วัตถุ Element แสดงถึงองค์ประกอบในเอกสาร HTML หรือ XML และเป็นวัตถุย่อยหลักของคลาส Node องค์ประกอบสามารถมีแอตทริบิวต์ได้ ดังนั้น Element จึงมีวิธีการในการเข้าถึงคุณลักษณะของมัน
องค์ประกอบสืบทอดมาจากโหนด องค์ประกอบเป็นคำจำกัดความขนาดเล็ก ต้องเป็นโหนดที่มีข้อมูลครบถ้วนจึงจะเป็นองค์ประกอบ เช่น <div>...</div> แต่โหนดไม่จำเป็นต้องเป็นองค์ประกอบ และองค์ประกอบจะต้องเป็นโหนด
โหนดมีหลายประเภทย่อย: องค์ประกอบ, ข้อความ, คุณสมบัติ, RootElement, ความคิดเห็น, เนมสเปซ ฯลฯ
2) แซ็กโซโฟน
3), เจโดม
4), DOM4J
(1) บทนำ
ปัจจุบัน dom4j เป็นโปรแกรมที่ดีที่สุดในการแยกวิเคราะห์ XML (JAXM ของ Hibernate และ Sun ยังใช้ dom4j เพื่อแยกวิเคราะห์ XML) มันรวมเอาฟังก์ชันต่างๆ มากมายนอกเหนือจากการแสดงเอกสาร XML พื้นฐาน รวมถึงการสนับสนุน XPath แบบรวม การสนับสนุน XML Schema และการประมวลผลตามเหตุการณ์ของเอกสารขนาดใหญ่หรือสตรีมมิ่ง
เมื่อใช้ XPATH ให้เพิ่ม jaxen.jar ไม่เช่นนั้นจะเกิดข้อผิดพลาดต่อไปนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
ข้อยกเว้นในเธรด "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
ที่ org.dom4j.DocumentFactory.createXPath (DocumentFactory.java:230)
ที่ org.dom4j.tree.AbstractNode.createXPath (AbstractNode.java:207)
ที่ org.dom4j.tree.AbstractNode.selectNodes (AbstractNode.java:164)
(2) โค้ดตัวอย่าง:
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.io.File;
นำเข้า java.io.FileWriter;
นำเข้า java.io.IOException;
นำเข้า java.io.StringReader;
นำเข้า java.io.StringWriter;
นำเข้า java.util.List;
นำเข้า org.dom4j.Document;
นำเข้า org.dom4j.DocumentException;
นำเข้า org.dom4j.DocumentHelper;
นำเข้า org.dom4j.Element;
นำเข้า org.dom4j.io.OutputFormat;
นำเข้า org.dom4j.io.SAXReader;
นำเข้า org.dom4j.io.XMLWriter;
นำเข้า org.xml.sax.InputSource;
XMLHandler ระดับสาธารณะ {
XMLHandler สาธารณะ () {
// TODO ต้นขั้วคอนสตรัคเตอร์ที่สร้างขึ้นอัตโนมัติ
-
สตริงสาธารณะ createXML(){
สตริง strXML = null;
เอกสารเอกสาร = DocumentHelper.createDocument();
องค์ประกอบ root = document.addElement("root");
โทรศัพท์องค์ประกอบ = root.addElement("โทรศัพท์");
องค์ประกอบ nokia = phone.addElement("ประเภท");
nokia.addAttribute("ชื่อ", "โนเกีย");
องค์ประกอบ price_nokia = nokia.addElement("ราคา");
price_nokia.addText("599");
องค์ประกอบ โอเปอเรเตอร์_nokia = nokia.addElement("โอเปอเรเตอร์");
โอเปอเรเตอร์_nokia.addText("CMCC");
องค์ประกอบ xiaomi = phone.addElement("ประเภท");
xiaomi.addAttribute("ชื่อ", "xiaomi");
องค์ประกอบ price_xiaomi = xiaomi.addElement("ราคา");
price_xiaomi.addText("699");
องค์ประกอบ โอเปอเรเตอร์_xiaomi = xiaomi.addElement("โอเปอเรเตอร์");
โอเปอเรเตอร์_xiaomi.addText("ChinaNet");
-
StringWriter strWtr = StringWriter ใหม่ ();
รูปแบบ OutputFormat = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter = XMLWriter ใหม่ (strWtr, รูปแบบ);
พยายาม {
xmlWriter.write(เอกสาร);
} จับ (IOException e1) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e1.printStackTrace();
-
strXML = strWtr.toString();
-
-
//strXML=document.asXML();
-
-
ไฟล์ไฟล์ = ไฟล์ใหม่ ("TelePhone.xml");
ถ้า (file.exists()) {
ไฟล์.ลบ();
-
พยายาม {
ไฟล์. createNewFile();
XMLWriter ออก = XMLWriter ใหม่ (FileWriter ใหม่ (ไฟล์));
ออกเขียน(เอกสาร);
ออก.ล้าง();
ออก.ปิด();
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
กลับ strXML;
-
parserXML โมฆะสาธารณะ (สตริง strXML) {
เครื่องอ่าน SAXReader = SAXReader ใหม่ ();
StringReader sr = StringReader ใหม่ (strXML);
InputSource คือ = InputSource ใหม่ (sr);
พยายาม {
เอกสารเอกสาร = reader.read(คือ);
รากองค์ประกอบ = document.getRootElement();
//รับองค์ประกอบ
รายการ <องค์ประกอบ> phoneList = root.elements("โทรศัพท์");
รายการ <องค์ประกอบ> typeList = phoneList.get(0).elements("type");
สำหรับ (int i=0;i<typeList.size();i++){
องค์ประกอบองค์ประกอบ = typeList.get (i);
สตริง phoneName = element.attributeValue("ชื่อ");
System.out.println("phonename = "+phoneName);
//รับองค์ประกอบทั้งหมด
รายการ <องค์ประกอบ> childList = element.elements();
สำหรับ (int j=0;j<childList.size();j++){
องค์ประกอบ e = childList.get(j);
System.out.println(e.getName()+"="+e.getText());
-
-
} จับ (DocumentException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
โมฆะสาธารณะ parserXMLbyXPath (String strXML) {
เครื่องอ่าน SAXReader = SAXReader ใหม่ ();
StringReader sr = StringReader ใหม่ (strXML);
InputSource คือ = InputSource ใหม่ (sr);
พยายาม {
เอกสารเอกสาร = reader.read(คือ);
รายการ รายการ = document.selectNodes("/root/TelePhone/type");
สำหรับ(int i=0;i<list.size();i++){
องค์ประกอบ e = (องค์ประกอบ) list.get(i);
System.out.println("phonename="+e.attributeValue("ชื่อ"));
รายการ list1 = e.selectNodes("./*");
สำหรับ(int j=0;j<list1.size();j++){
องค์ประกอบ e1 = (องค์ประกอบ) list1.get(j);
System.out.println(e1.getName()+"="+e1.getText());
-
-
} จับ (DocumentException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
ตัวจัดการ XMLHandler = XMLHandler ใหม่ ();
สตริง strXML=handler.createXML();
System.out.println(strXML);
handler.parserXML(strXML);
System.out.println("-----------");
handler.parserXMLbyXPath(strXML);
-
-
5)เอ็กซ์พาธ
(1) บทนำ
XPath เป็นภาษาสำหรับค้นหาข้อมูลในเอกสาร XML XPath ใช้เพื่อนำทางผ่านองค์ประกอบและคุณลักษณะในเอกสาร XML
สำหรับการแนะนำไวยากรณ์เฉพาะ โปรดดูที่: http://w3school.com.cn/xpath/index.asp
(2) โค้ดตัวอย่าง:
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.io.IOException;
นำเข้า java.io.StringReader;
นำเข้า javax.xml.parsers.DocumentBuilder;
นำเข้า javax.xml.parsers.DocumentBuilderFactory;
นำเข้า javax.xml.parsers.ParserConfigurationException;
นำเข้า javax.xml.xpath.XPath;
นำเข้า javax.xml.xpath.XPathConstants;
นำเข้า javax.xml.xpath.XPathExpression;
นำเข้า javax.xml.xpath.XPathExpressionException;
นำเข้า javax.xml.xpath.XPathFactory;
นำเข้า org.w3c.dom.Document;
นำเข้า org.w3c.dom.Element;
นำเข้า org.w3c.dom.Node;
นำเข้า org.w3c.dom.NodeList;
นำเข้า org.xml.sax.InputSource;
นำเข้า org.xml.sax.SAXException;
XMLHandler ระดับสาธารณะ {
XMLHandler สาธารณะ () {
// TODO ต้นขั้วคอนสตรัคเตอร์ที่สร้างขึ้นอัตโนมัติ
-
parserXML โมฆะสาธารณะ (สตริง strXML) {
โรงงาน DocumentBuilderFactory = DocumentBuilderFactory.newInstance();
พยายาม {
ตัวสร้าง DocumentBuilder = โรงงาน newDocumentBuilder();
StringReader sr = StringReader ใหม่ (strXML);
InputSource คือ = InputSource ใหม่ (sr);
เอกสาร doc = builder.parse(is);
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile("/root/TelePhone/type");
โทรศัพท์ NodeList = (NodeList) expr.evaluate (doc, XPathConstants.NODESET);
สำหรับ (int i = 0; i < phone.getLength(); i++) {
ประเภทโหนด = phone.item (i);
สตริง phoneName = ((องค์ประกอบ) ประเภท).getAttribute("ชื่อ");
System.out.println("หมายเลขโทรศัพท์ = "+phoneName);
XPathExpression expr1 = xpath.compile("./*");
รายการ NodeList = (NodeList) expr1.evaluate (ประเภท XPathConstants.NODESET);
สำหรับ(int j =0;j<list.getLength();j++){
องค์ประกอบ e1 = (องค์ประกอบ) list.item(j);
System.out.println(e1.getNodeName()+"="+e1.getTextContent());
-
-
} จับ (ParserConfigurationException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (SAXException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (XPathExpressionException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
สตริง strXML="<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"no/"?>"+
"<รูท>"+
"<โทรศัพท์>"+
"<พิมพ์ชื่อ="โนเกีย/">"+
"<ราคา>599</ราคา>"+
"<โอเปอเรเตอร์>CMCC</โอเปอเรเตอร์>"+
"</ประเภท>"+
"<ประเภทชื่อ="xiaomi/">"+
"<ราคา>699</ราคา>"+
"<โอเปอเรเตอร์>ChinaNet</โอเปอเรเตอร์>"+
"</ประเภท>"+
"</โทรศัพท์>"+
"</รูท>";
ตัวจัดการ XMLHandler = XMLHandler ใหม่ ();
handler.parserXML(strXML);
-
-
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