ขณะนี้ XML กลายเป็นรูปแบบการแลกเปลี่ยนข้อมูลที่เป็นสากล ความเป็นอิสระของแพลตฟอร์ม ความเป็นอิสระทางภาษา และความเป็นอิสระของระบบ ทำให้การรวมและการโต้ตอบข้อมูลสะดวกยิ่งขึ้น สำหรับความรู้ด้านไวยากรณ์และรายละเอียดทางเทคนิคของ XML คุณต้องอ่านเอกสารทางเทคนิคที่เกี่ยวข้อง ซึ่งรวมถึง DOM (Document Object Model), DTD (Document Type Definition), SAX (Simple API for XML), XSD (Xml Schema Definition) ) , XSLT (Extensible Stylesheet Language Transformations) สำหรับรายละเอียด โปรดดูเอกสารเว็บไซต์อย่างเป็นทางการของ w3c http://www.w3.org สำหรับข้อมูลเพิ่มเติม
XML ถูกแยกวิเคราะห์ในลักษณะเดียวกันในภาษาต่างๆ แต่ไวยากรณ์ที่ใช้นั้นแตกต่างกัน มีสองวิธีพื้นฐานในการแยกวิเคราะห์ วิธีหนึ่งเรียกว่า SAX และอีกวิธีหนึ่งเรียกว่า DOM SAX ขึ้นอยู่กับการแยกวิเคราะห์สตรีมเหตุการณ์ และ DOM ขึ้นอยู่กับการแยกวิเคราะห์โครงสร้างต้นไม้เอกสาร XML สมมติว่าเนื้อหาและโครงสร้างของ XML ของเรามีดังนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
<?xml version="1.0" encoding="UTF-8"?>
<พนักงาน>
<พนักงาน>
<ชื่อ>ddviplinux</name>
<เพศ>ม</เพศ>
<อายุ>30</อายุ>
</พนักงาน>
</พนักงาน>
บทความนี้ใช้ภาษา Java เพื่อใช้การสร้างเอกสาร XML และการแยกวิเคราะห์ DOM และ SAX
ขั้นแรกให้กำหนดอินเทอร์เฟซสำหรับปฏิบัติการเอกสาร XML XmlDocument โดยจะกำหนดอินเทอร์เฟซสำหรับการสร้างและแยกวิเคราะห์เอกสาร XML
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ com.alisoft.facepay.framework.bean;
-
-
* @ผู้เขียน hongliang.dinghl
* กำหนดอินเทอร์เฟซสำหรับการสร้างและแยกวิเคราะห์เอกสาร XML
-
อินเทอร์เฟซสาธารณะ XmlDocument {
-
* สร้างเอกสาร XML
* @param fileName ชื่อพาธแบบเต็มของไฟล์
-
โมฆะสาธารณะ createXml (ชื่อไฟล์สตริง);
-
* แยกวิเคราะห์เอกสาร XML
* @param fileName ชื่อพาธแบบเต็มของไฟล์
-
parserXml โมฆะสาธารณะ (ชื่อไฟล์สตริง);
-
1.DOM สร้างและแยกวิเคราะห์เอกสาร XML
ชุดของอินเทอร์เฟซถูกกำหนดไว้สำหรับเวอร์ชันแยกวิเคราะห์ของเอกสาร XML โปรแกรมแยกวิเคราะห์จะอ่านเอกสารทั้งหมดและสร้างโครงสร้างแผนผังหน่วยความจำซึ่งโค้ดสามารถจัดการได้โดยใช้อินเทอร์เฟซ DOM ข้อดี: แผนผังเอกสารทั้งหมดอยู่ในหน่วยความจำ ใช้งานง่าย รองรับฟังก์ชันต่างๆ เช่น การลบ การแก้ไข และการจัดเรียงใหม่ ข้อเสีย: การถ่ายโอนเอกสารทั้งหมดไปยังหน่วยความจำ (รวมถึงโหนดที่ไม่มีประโยชน์) จะทำให้เสียเวลาและพื้นที่ในการใช้งาน: เมื่อแยกวิเคราะห์เอกสารแล้ว จำเป็นต้องเข้าถึงข้อมูลนี้หลายครั้ง ทรัพยากรฮาร์ดแวร์ก็เพียงพอแล้ว (หน่วยความจำ, CPU)
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ com.alisoft.facepay.framework.bean;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.FileNotFoundException;
นำเข้า java.io.FileOutputStream;
นำเข้า java.io.IOException;
นำเข้า java.io.InputStream;
นำเข้า java.io.PrintWriter;
นำเข้า javax.xml.parsers.DocumentBuilder;
นำเข้า javax.xml.parsers.DocumentBuilderFactory;
นำเข้า javax.xml.parsers.ParserConfigurationException;
นำเข้า javax.xml.transform.OutputKeys;
นำเข้า 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.SAXException;
-
-
* @ผู้เขียน hongliang.dinghl
* การสร้าง DOM และแยกวิเคราะห์เอกสาร XML
-
DomDemo ระดับสาธารณะใช้ XmlDocument {
เอกสารเอกสารส่วนตัว
ชื่อไฟล์สตริงส่วนตัว;
โมฆะสาธารณะ init() {
พยายาม {
โรงงาน DocumentBuilderFactory = DocumentBuilderFactory
.newInstance();
ตัวสร้าง DocumentBuilder = โรงงาน newDocumentBuilder();
this.document = builder.newDocument();
} จับ (ParserConfigurationException e) {
System.out.println(e.getMessage());
-
-
โมฆะสาธารณะ createXml (ชื่อไฟล์สตริง) {
องค์ประกอบ root = this.document.createElement("พนักงาน");
this.document.appendChild (ราก);
พนักงานองค์ประกอบ = this.document.createElement("พนักงาน");
ชื่อองค์ประกอบ = this.document.createElement("name");
name.appendChild(this.document.createTextNode("ติ๊งหงเหลียง"));
Employee.appendChild (ชื่อ);
องค์ประกอบเพศ = this.document.createElement("เพศ");
sex.appendChild(this.document.createTextNode("m"));
Employee.appendChild (เพศ);
อายุองค์ประกอบ = this.document.createElement("อายุ");
age.appendChild(this.document.createTextNode("30"));
Employee.appendChild (อายุ);
root.appendChild (พนักงาน);
TransformerFactory tf = TransformerFactory.newInstance();
พยายาม {
หม้อแปลงไฟฟ้า หม้อแปลงไฟฟ้า = tf.newTransformer();
แหล่งที่มาของ DOMSource = แหล่งที่มาของ DOMSource ใหม่ (เอกสาร);
Transformer.setOutputProperty (OutputKeys.ENCODING, "gb2312");
Transformer.setOutputProperty (OutputKeys.INDENT, "ใช่");
PrintWriter pw = PrintWriter ใหม่ (FileOutputStream ใหม่ (ชื่อไฟล์));
ผลลัพธ์ StreamResult = StreamResult ใหม่ (pw);
Transformer.transform(แหล่งที่มา, ผลลัพธ์);
System.out.println("สร้างไฟล์ XML สำเร็จแล้ว!");
} จับ (TransformerConfigurationException e) {
System.out.println(e.getMessage());
} จับ (IllegalArgumentException e) {
System.out.println(e.getMessage());
} จับ (FileNotFoundException จ) {
System.out.println(e.getMessage());
} จับ (TransformerException e) {
System.out.println(e.getMessage());
-
-
โมฆะสาธารณะ parserXml (ชื่อไฟล์สตริง) {
พยายาม {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
เอกสารเอกสาร = db.parse (ชื่อไฟล์);
พนักงาน NodeList = document.getChildNodes();
สำหรับ (int i = 0; i < Employee.getLength(); i++) {
พนักงานโหนด = Employee.item(i);
NodeList EmployeeInfo = Employee.getChildNodes();
สำหรับ (int j = 0; j < EmployeeInfo.getLength(); j++) {
โหนดโหนด = EmployeeInfo.item(j);
NodeList EmployeeMeta = node.getChildNodes();
สำหรับ (int k = 0; k < EmployeeMeta.getLength(); k++) {
System.out.println(employeeMeta.item(k).getNodeName()
+ /// + EmployeeMeta.item(k).getTextContent());
-
-
-
System.out.println("การแยกวิเคราะห์เสร็จสมบูรณ์");
} จับ (FileNotFoundException จ) {
System.out.println(e.getMessage());
} จับ (ParserConfigurationException e) {
System.out.println(e.getMessage());
} จับ (SAXException จ) {
System.out.println(e.getMessage());
} จับ (IOException จ) {
System.out.println(e.getMessage());
-
-
-
2.SAX สร้างและแยกวิเคราะห์เอกสาร XML
เพื่อแก้ไขปัญหาของ DOM SAX จึงปรากฏขึ้น SAX ขับเคลื่อนด้วยเหตุการณ์ เมื่อ parser ค้นหาจุดเริ่มต้นขององค์ประกอบ จุดสิ้นสุดขององค์ประกอบ จุดเริ่มต้นหรือจุดสิ้นสุดของข้อความ เอกสาร ฯลฯ Parser จะส่งเหตุการณ์ และโปรแกรมเมอร์เขียนโค้ดที่ตอบสนองต่อเหตุการณ์เหล่านี้และบันทึกข้อมูล ข้อดี: ไม่จำเป็นต้องโหลดเอกสารทั้งหมดล่วงหน้า และใช้ทรัพยากรน้อยกว่า รหัสตัวแยกวิเคราะห์ SAX มีขนาดเล็กกว่ารหัสตัวแยกวิเคราะห์ DOM และเหมาะสำหรับแอปเพล็ตและการดาวน์โหลด ข้อเสีย: ไม่คงอยู่ หลังจากเหตุการณ์ หากข้อมูลไม่ถูกบันทึก ข้อมูลจะสูญหาย สามารถรับได้เฉพาะข้อความจากเหตุการณ์เท่านั้น แต่ไม่ทราบว่าข้อความนั้นเป็นขององค์ประกอบใด เอกสาร XML เนื้อหาจำนวนน้อย ไม่ค่อยมีผู้กลับมาใช้หน่วยความจำเครื่องอีก
รหัสจาวา
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ com.alisoft.facepay.framework.bean;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.FileNotFoundException;
นำเข้า java.io.IOException;
นำเข้า java.io.InputStream;
นำเข้า javax.xml.parsers.ParserConfigurationException;
นำเข้า javax.xml.parsers.SAXParser;
นำเข้า javax.xml.parsers.SAXParserFactory;
นำเข้า org.xml.sax.Attributes;
นำเข้า org.xml.sax.SAXException;
นำเข้า org.xml.sax.helpers.DefaultHandler;
-
-
* @ผู้เขียน hongliang.dinghl
* การแยกวิเคราะห์เอกสาร SAX
-
SaxDemo ระดับสาธารณะใช้ XmlDocument {
โมฆะสาธารณะ createXml (ชื่อไฟล์สตริง) {
System.out.println("<<"+ชื่อไฟล์+">>");
-
โมฆะสาธารณะ parserXml (ชื่อไฟล์สตริง) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
พยายาม {
SAXParser saxparser = saxfac.newSAXParser();
InputStream คือ = FileInputStream ใหม่ (ชื่อไฟล์);
saxparser.parse (คือ MySAXHandler ใหม่ ());
} จับ (ParserConfigurationException e) {
e.printStackTrace();
} จับ (SAXException จ) {
e.printStackTrace();
} จับ (FileNotFoundException จ) {
e.printStackTrace();
} จับ (IOException จ) {
e.printStackTrace();
-
-
-
คลาส MySAXHandler ขยาย DefaultHandler {
hasAttribute บูลีน = false;
คุณลักษณะแอตทริบิวต์ = null;
โมฆะสาธารณะ startDocument () พ่น SAXException {
System.out.println("เอกสารเริ่มพิมพ์แล้ว");
-
โมฆะสาธารณะ endDocument () พ่น SAXException {
System.out.println("การพิมพ์เอกสารสิ้นสุด");
-
โมฆะสาธารณะ startElement (สตริง uri, สตริง localName, สตริง qName,
คุณลักษณะแอตทริบิวต์) พ่น SAXException {
ถ้า (qName.equals("พนักงาน")) {
กลับ;
-
ถ้า (qName.equals("พนักงาน")) {
System.out.println(qName);
-
ถ้า (attributes.getLength() > 0) {
this.attributes = คุณลักษณะ;
this.hasAttribute = จริง;
-
-
โมฆะสาธารณะ endElement (สตริง uri, สตริงชื่อท้องถิ่น, สตริง qName)
พ่น SAXException {
ถ้า (hasAttribute && (แอตทริบิวต์ != null)) {
สำหรับ (int i = 0; i <attributes.getLength(); i++) {
System.out.println (แอตทริบิวต์ getQName (0)
+ คุณลักษณะ.getValue(0));
-
-
-
อักขระโมฆะสาธารณะ (char [] ch, int start, int length)
พ่น SAXException {
System.out.println (สตริงใหม่ (ch, เริ่มต้น, ความยาว));
-
-
แพ็คเกจ com.alisoft.facepay.framework.bean;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.FileNotFoundException;
นำเข้า java.io.IOException;
นำเข้า java.io.InputStream;
นำเข้า javax.xml.parsers.ParserConfigurationException;
นำเข้า javax.xml.parsers.SAXParser;
นำเข้า javax.xml.parsers.SAXParserFactory;
นำเข้า org.xml.sax.Attributes;
นำเข้า org.xml.sax.SAXException;
นำเข้า org.xml.sax.helpers.DefaultHandler;
-
-
* @ผู้เขียน hongliang.dinghl
* การแยกวิเคราะห์เอกสาร SAX
-
SaxDemo ระดับสาธารณะใช้ XmlDocument {
โมฆะสาธารณะ createXml (ชื่อไฟล์สตริง) {
System.out.println("<<"+ชื่อไฟล์+">>");
-
โมฆะสาธารณะ parserXml (ชื่อไฟล์สตริง) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
พยายาม {
SAXParser saxparser = saxfac.newSAXParser();
InputStream คือ = FileInputStream ใหม่ (ชื่อไฟล์);
saxparser.parse (คือ MySAXHandler ใหม่ ());
} จับ (ParserConfigurationException e) {
e.printStackTrace();
} จับ (SAXException จ) {
e.printStackTrace();
} จับ (FileNotFoundException จ) {
e.printStackTrace();
} จับ (IOException จ) {
e.printStackTrace();
-
-
-
คลาส MySAXHandler ขยาย DefaultHandler {
hasAttribute บูลีน = false;
คุณลักษณะแอตทริบิวต์ = null;
โมฆะสาธารณะ startDocument () พ่น SAXException {
System.out.println("เอกสารเริ่มพิมพ์แล้ว");
-
โมฆะสาธารณะ endDocument () พ่น SAXException {
System.out.println("การพิมพ์เอกสารสิ้นสุด");
-
โมฆะสาธารณะ startElement (สตริง uri, สตริง localName, สตริง qName,
คุณลักษณะแอตทริบิวต์) พ่น SAXException {
ถ้า (qName.equals("พนักงาน")) {
กลับ;
-
ถ้า (qName.equals("พนักงาน")) {
System.out.println(qName);
-
ถ้า (attributes.getLength() > 0) {
this.attributes = คุณลักษณะ;
this.hasAttribute = จริง;
-
-
โมฆะสาธารณะ endElement (สตริง uri, สตริงชื่อท้องถิ่น, สตริง qName)
พ่น SAXException {
ถ้า (hasAttribute && (แอตทริบิวต์ != null)) {
สำหรับ (int i = 0; i <attributes.getLength(); i++) {
System.out.println (แอตทริบิวต์ getQName (0)
+ คุณลักษณะ.getValue(0));
-
-
-
อักขระโมฆะสาธารณะ (char [] ch, int start, int length)
พ่น SAXException {
System.out.println (สตริงใหม่ (ch, เริ่มต้น, ความยาว));
-
-
3.DOM4J สร้างและแยกวิเคราะห์เอกสาร XML
DOM4J เป็น Java XML API ที่ยอดเยี่ยมมาก พร้อมด้วยประสิทธิภาพที่ยอดเยี่ยม ฟังก์ชันอันทรงพลัง และความสะดวกในการใช้งานอย่างมาก นอกจากนี้ยังเป็นซอฟต์แวร์โอเพ่นซอร์สอีกด้วย ทุกวันนี้ คุณจะเห็นว่าซอฟต์แวร์ Java ใช้ DOM4J ในการอ่านและเขียน XML มากขึ้นเรื่อยๆ เป็นเรื่องที่น่าสังเกตว่าแม้แต่ JAXM ของ Sun ก็ใช้ DOM4J เช่นกัน
รหัสจาวา
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ com.alisoft.facepay.framework.bean;
นำเข้า java.io.File;
นำเข้า java.io.FileWriter;
นำเข้า java.io.IOException;
นำเข้า java.io.Writer;
นำเข้า java.util.Iterator;
นำเข้า org.dom4j.Document;
นำเข้า org.dom4j.DocumentException;
นำเข้า org.dom4j.DocumentHelper;
นำเข้า org.dom4j.Element;
นำเข้า org.dom4j.io.SAXReader;
นำเข้า org.dom4j.io.XMLWriter;
-
-
* @ผู้เขียน hongliang.dinghl
* Dom4j สร้างเอกสาร XML และแยกวิเคราะห์เอกสาร XML
-
คลาสสาธารณะ Dom4jDemo ใช้ XmlDocument {
โมฆะสาธารณะ createXml (ชื่อไฟล์สตริง) {
เอกสารเอกสาร = DocumentHelper.createDocument();
พนักงานองค์ประกอบ=document.addElement("พนักงาน");
พนักงานองค์ประกอบ=employees.addElement("พนักงาน");
ชื่อองค์ประกอบ= Employee.addElement("ชื่อ");
name.setText("ddvip");
องค์ประกอบ sex=employee.addElement("เพศ");
sex.setText("m");
อายุองค์ประกอบ=employee.addElement("อายุ");
age.setText("29");
พยายาม {
ตัวเขียน fileWriter=ตัวเขียนไฟล์ใหม่ (ชื่อไฟล์);
XMLWriter xmlWriter=XMLWriter ใหม่(fileWriter);
xmlWriter.write(เอกสาร);
xmlWriter.ปิด();
} จับ (IOException จ) {
System.out.println(e.getMessage());
-
-
โมฆะสาธารณะ parserXml (ชื่อไฟล์สตริง) {
ไฟล์ inputXml=ไฟล์ใหม่ (ชื่อไฟล์);
SAXReader saxReader = SAXReader ใหม่();
พยายาม {
เอกสารเอกสาร = saxReader.read(inputXml);
พนักงานองค์ประกอบ=document.getRootElement();
สำหรับ (Iterator i = Employee.elementIterator(); i.hasNext();){
พนักงานองค์ประกอบ = (องค์ประกอบ) i.next();
สำหรับ (Iterator j = Employee.elementIterator(); j.hasNext();){
โหนดองค์ประกอบ = (องค์ประกอบ) j.next ();
System.out.println(node.getName()+//////+node.getText());
-
-
} จับ (DocumentException e) {
System.out.println(e.getMessage());
-
System.out.println("dom4j parserXml");
-
-
4.JDOM สร้างและแยกวิเคราะห์ XML
เพื่อลดจำนวนการเข้ารหัสสำหรับ DOM และ SAX JDOM จึงปรากฏขึ้น ข้อดี: หลักการ 20-80 ช่วยลดจำนวนโค้ดได้อย่างมาก โอกาสการใช้งาน: ฟังก์ชั่นที่จะนำไปใช้นั้นเรียบง่าย เช่น การแยกวิเคราะห์ การสร้าง ฯลฯ แต่ที่ระดับล่างสุด JDOM ยังคงใช้เอกสาร SAX (ที่ใช้กันมากที่สุด), DOM และ Xanan
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ com.alisoft.facepay.framework.bean;
นำเข้า java.io.FileNotFoundException;
นำเข้า java.io.FileOutputStream;
นำเข้า java.io.IOException;
นำเข้า java.util.List;
นำเข้า org.jdom.Document;
นำเข้า org.jdom.Element;
นำเข้า org.jdom.JDOMException;
นำเข้า org.jdom.input.SAXBuilder;
นำเข้า org.jdom.output.XMLOutputter;
-
-
* @ผู้เขียน hongliang.dinghl
* JDOM สร้างและแยกวิเคราะห์เอกสาร XML
-
-
JDomDemo คลาสสาธารณะใช้ XmlDocument {
โมฆะสาธารณะ createXml (ชื่อไฟล์สตริง) {
เอกสารเอกสาร
รากองค์ประกอบ
root=องค์ประกอบใหม่("พนักงาน");
เอกสาร = เอกสารใหม่ (รูท);
พนักงานองค์ประกอบ = องค์ประกอบใหม่ ("พนักงาน");
root.addContent (พนักงาน);
ชื่อองค์ประกอบ=องค์ประกอบใหม่("ชื่อ");
name.setText("ddvip");
Employee.addContent (ชื่อ);
องค์ประกอบ sex=องค์ประกอบใหม่ ("เพศ");
sex.setText("m");
Employee.addContent(เพศ);
อายุองค์ประกอบ = องค์ประกอบใหม่ ("อายุ");
age.setText("23");
Employee.addContent(อายุ);
XMLOutputter XMLOut = XMLOutputter ใหม่();
พยายาม {
XMLOut.output (เอกสาร FileOutputStream ใหม่ (ชื่อไฟล์));
} จับ (FileNotFoundException จ) {
e.printStackTrace();
} จับ (IOException จ) {
e.printStackTrace();
-
-
โมฆะสาธารณะ parserXml (ชื่อไฟล์สตริง) {
SAXBuilder builder = ใหม่ SAXBuilder (เท็จ);
พยายาม {
เอกสารเอกสาร=builder.build(ชื่อไฟล์);
พนักงานองค์ประกอบ=document.getRootElement();
รายชื่อ EmployeeList=employees.getChildren("พนักงาน");
สำหรับ (int i=0;พนักงาน iElement=(องค์ประกอบ)employeeList.get(i);
รายชื่อ EmployeeInfo=employee.getChildren();
for(int j=0;jSystem.out.println(((องค์ประกอบ)employeeInfo.get(j)).getName()+:+((องค์ประกอบ)employeeInfo.get(j)).getValue());
-
-
} จับ (JDOMException จ) {
e.printStackTrace();
} จับ (IOException จ) {
e.printStackTrace();
-
-
-