XML ได้กลายเป็นรูปแบบการแลกเปลี่ยนข้อมูลทั่วไป แพลตฟอร์มที่ไม่ขึ้นกับภาษาอิสระและเป็นอิสระจากระบบนำมาซึ่งความสะดวกสบายอย่างมากในการรวมข้อมูลและการโต้ตอบ สำหรับความรู้ทางไวยากรณ์และรายละเอียดทางเทคนิคของ XML คุณต้องอ่านเอกสารทางเทคนิคที่เกี่ยวข้อง เนื้อหาที่รวมอยู่ที่นี่รวมถึง DOM (โมเดลวัตถุเอกสาร), DTD (คำจำกัดความประเภทเอกสาร), SAX (Simple API สำหรับ XML), XSD (นิยาม XML Schema), XSLT (การแปลงภาษาสไตล์ชีท Extensible) สำหรับรายละเอียดโปรดดูเอกสารเว็บไซต์อย่างเป็นทางการของ W3C http://www.w3.org สำหรับข้อมูลเพิ่มเติม
วิธีการแยกวิเคราะห์ XML นั้นเหมือนกันในภาษาที่แตกต่างกัน แต่ไวยากรณ์การใช้งานนั้นแตกต่างกัน มีวิธีการวิเคราะห์พื้นฐานสองวิธีหนึ่งเรียกว่า SAX และอีกวิธีหนึ่งเรียกว่า DOM SAX ขึ้นอยู่กับการวิเคราะห์สตรีมเหตุการณ์และ DOM ขึ้นอยู่กับการวิเคราะห์โครงสร้างแผนผังแผนผัง XML สมมติว่าเนื้อหาและโครงสร้างของ XML ของเรามีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <พนักงาน> <พนักงาน> <name> ddviplinux </name> <ex> m </sux> <mate> 30 </sy>
บทความนี้ใช้ภาษา Java เพื่อใช้การสร้างและการแยกวิเคราะห์เอกสาร XML ของ DOM และ SAX
ขั้นแรกให้กำหนดอินเทอร์เฟซสำหรับการใช้งานเอกสาร XML XMLDocument ซึ่งกำหนดอินเทอร์เฟซสำหรับการสร้างและแยกวิเคราะห์เอกสาร XML
/ **** @author hongliang.dinghl* กำหนดอินเตอร์เฟสระหว่างการสร้างเอกสาร XML และการแยกวิเคราะห์*/ อินเตอร์เฟสสาธารณะ xmldocument {/ *** สร้างเอกสาร XML* @param ชื่อไฟล์ชื่อเต็มชื่อ*/ โมฆะสาธารณะ createxml (ชื่อไฟล์สตริงไฟล์); / *** Parse XML Document* @Param ชื่อไฟล์ชื่อเต็มชื่อ*/ โมฆะสาธารณะ parserxml (ชื่อไฟล์สตริง); - 1. DOM สร้างและแยกวิเคราะห์เอกสาร XML
กำหนดชุดของอินเทอร์เฟซสำหรับเวอร์ชันที่แยกวิเคราะห์ของเอกสาร XML ตัวแยกวิเคราะห์อ่านเอกสารทั้งหมดจากนั้นสร้างโครงสร้างต้นไม้ที่อยู่อาศัยของหน่วยความจำและรหัสสามารถใช้อินเทอร์เฟซ DOM เพื่อใช้งานโครงสร้างต้นไม้นี้ ข้อดี: แผนผังเอกสารทั้งหมดอยู่ในหน่วยความจำซึ่งใช้งานง่าย รองรับฟังก์ชั่นต่าง ๆ เช่นการลบการดัดแปลงและการจัดเรียงใหม่ ข้อเสีย: เอกสารทั้งหมดถูกถ่ายโอนไปยังหน่วยความจำ (รวมถึงโหนดที่ไร้ประโยชน์) เสียเวลาและพื้นที่ ในการใช้งาน: เมื่อเอกสารถูกแยกวิเคราะห์จำเป็นต้องเข้าถึงข้อมูลนี้หลายครั้ง ทรัพยากรฮาร์ดแวร์ที่เพียงพอ (หน่วยความจำ, CPU)
นำเข้า 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; / ** * * @author Hongliang.dingHl * การสร้าง DOM และการแยกวิเคราะห์เอกสาร XML */ คลาสสาธารณะ Domdemo ใช้ Xmldocument {เอกสารเอกสารส่วนตัว; ชื่อไฟล์สตริงส่วนตัว; โมฆะสาธารณะ init () {ลอง {DocumentBuilderFactory Factory = DocumentBuilderFactory .NewInstance (); DocumentBuilder Builder = Factory.newDocumentBuilder (); this.document = builder.newDocument (); } catch (parserconfigurationException e) {system.out.println (e.getMessage ()); }} โมฆะสาธารณะ createxml (ชื่อไฟล์สตริง) {element root = this.document.createElement ("พนักงาน"); this.document.appendchild (รูท); Element Employee = this.document.createElement ("พนักงาน"); ชื่อองค์ประกอบ = this.document.createElement ("ชื่อ"); Name.AppendChild (this.document.createtextNode ("Ding Hongliang")); Employee.AppendChild (ชื่อ); Element sex = this.document.createelement ("Sex"); sex.appendchild (this.document.createtextNode ("M")); Employee.AppendChild (เพศ); Element Age = this.document.createElement ("อายุ"); Age.AppendChild (this.document.createtextNode ("30")); พนักงาน. AppendChild (อายุ); root.appendchild (พนักงาน); TransformerFactory TF = TransformerFactory.NewInstance (); ลอง {transformer transformer = tf.newTransformer (); Domsource Source = new domsource (เอกสาร); transformer.setOutputProperty (outputKeys.encoding, "GB2312"); transformer.setOutputProperty (outputKeys.indent, "ใช่"); PrintWriter PW = New PrintWriter (ใหม่ FileOutputStream (ชื่อไฟล์)); streamResult result = new StreamResult (PW); transformer.transform (แหล่งที่มา, ผลลัพธ์); System.out.println ("สร้างไฟล์ XML สำเร็จ!"); } catch (transformerConfigurationException e) {system.out.println (e.getMessage ()); } catch (unledalargumentException e) {system.out.println (e.getMessage ()); } catch (filenotfoundexception e) {system.out.println (e.getMessage ()); } catch (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 <พนักงาน. getLength (); i ++) {node Employee = พนักงาน. item (i); Nodelist EmployeeInfo = Employee.getChildNodes (); สำหรับ (int j = 0; j <empereeeinfo.getLength (); j ++) {node node = experationeeinfo.item (j); Nodelist EmployEeMeta = node.getChildNodes (); สำหรับ (int k = 0; k <exmereemeta.getLength (); k ++) {system.out.println (EmployeEmeta.Item (K) .getNodename () + ":" + EmpereEmeta.Item (k) .getTextContent ()); }}} system.out.println ("parsermeta.item (k) .getTextContent ());} catch (filenotfoundException e) {system.out.println (e.getMessage (); e) {system.out.println (e.getMessage ()); 2. SAX สร้างและแยกวิเคราะห์เอกสาร XML
เพื่อแก้ปัญหา DOM SAX จะปรากฏขึ้น แซ็กโซโฟนขับเคลื่อนเหตุการณ์ เมื่อตัวแยกวิเคราะห์ค้นพบจุดเริ่มต้นขององค์ประกอบจุดสิ้นสุดขององค์ประกอบจุดเริ่มต้นหรือจุดสิ้นสุดของเอกสาร ฯลฯ มันจะส่งเหตุการณ์และโปรแกรมเมอร์เขียนโค้ดเพื่อตอบสนองต่อเหตุการณ์เหล่านี้และบันทึกข้อมูล ข้อดี: ไม่จำเป็นต้องป้อนเอกสารทั้งหมดล่วงหน้าจะใช้ทรัพยากรน้อยลง รหัสแยกวิเคราะห์แซ็กโซโฟนมีขนาดเล็กกว่ารหัส DOM Parser เหมาะสำหรับแอปเพล็ตและดาวน์โหลด ข้อเสีย: ไม่ถาวร หลังจากเหตุการณ์หากไม่ได้บันทึกข้อมูลข้อมูลจะหายไป การไร้สัญชาติ; สามารถรับข้อความได้จากเหตุการณ์เท่านั้น แต่ไม่ทราบว่าองค์ประกอบใดที่เป็นของข้อความ โอกาสในการใช้งาน: แอปเพล็ต; จำเป็นต้องมีเนื้อหาเพียงเล็กน้อยจากเอกสาร XML และไม่ค่อยกลับไปเข้าถึง หน่วยความจำเครื่องต่ำ
นำเข้า 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; / ** * * @author Hongliang.dingHl * SAX Document Parsing */ คลาสสาธารณะ Saxdemo ใช้ Xmldocument {โมฆะสาธารณะ createxml (ชื่อไฟล์สตริง) {System.out.println ("<<"+ชื่อไฟล์+">>"); } โมฆะสาธารณะ parserxml (ชื่อไฟล์สตริง) {saxparserfactory saxfac = saxparserfactory.newinstance (); ลอง {saxparser saxparser = saxfac.newsaxparser (); inputStream คือ = ใหม่ FileInputStream (ชื่อไฟล์); saxparser.parse (คือ, mysaxhandler ใหม่ ()); } catch (parserconfigurationException e) {e.printstacktrace (); } catch (saxexception e) {e.printstacktrace (); } catch (filenotfoundException e) {e.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); }} คลาส MySaxHandler ขยาย defaulthandler {boolean hasattribute = false; แอตทริบิวต์แอตทริบิวต์ = null; โมฆะสาธารณะ startDocument () พ่น saxexception {system.out.println ("เอกสารได้เริ่มการพิมพ์"); } โมฆะสาธารณะ enddocument () พ่น SaxException {system.out.println ("เอกสารได้สิ้นสุดลงการพิมพ์"); } โมฆะสาธารณะ startElement (String uri, String localName, String qName, แอตทริบิวต์แอตทริบิวต์) พ่น SaxException {ถ้า (qName.equals ("พนักงาน")) {return; } if (qname.equals ("พนักงาน")) {system.out.println (qName); } if (attributes.getLength ()> 0) {this.attributes = แอตทริบิวต์; this.hasattribute = true; }} โมฆะสาธารณะ endelement (สตริง uri, สตริง localname, สตริง qname) พ่น saxexception {ถ้า (hasattribute && (แอตทริบิวต์! = null)) {สำหรับ (int i = 0; i <attributes.getLength (); i ++) {system.out.println }}} อักขระโมฆะสาธารณะ (char [] ch, int start, ความยาว int) พ่น saxexception {system.out.println (สตริงใหม่ (ch, start, ความยาว)); }} แพ็คเกจ 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; / ** * * @author Hongliang.dingHl * SAX Document Parsing */ คลาสสาธารณะ Saxdemo ใช้ Xmldocument {โมฆะสาธารณะ createxml (ชื่อไฟล์สตริง) {System.out.println ("<<"+ชื่อไฟล์+">>"); } โมฆะสาธารณะ parserxml (ชื่อไฟล์สตริง) {saxparserfactory saxfac = saxparserfactory.newinstance (); ลอง {saxparser saxparser = saxfac.newsaxparser (); inputStream คือ = ใหม่ FileInputStream (ชื่อไฟล์); saxparser.parse (คือ, mysaxhandler ใหม่ ()); } catch (parserconfigurationException e) {e.printstacktrace (); } catch (saxexception e) {e.printstacktrace (); } catch (filenotfoundException e) {e.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); }}} คลาส mysaxhandler ขยาย defaulthandler {boolean hasattribute = false; แอตทริบิวต์แอตทริบิวต์ = null; โมฆะสาธารณะ startDocument () พ่น saxexception {system.out.println ("เอกสารได้เริ่มการพิมพ์"); } โมฆะสาธารณะ enddocument () พ่น SaxException {system.out.println ("เอกสารได้สิ้นสุดลงการพิมพ์"); } โมฆะสาธารณะ startElement (String uri, String localName, String qName, แอตทริบิวต์แอตทริบิวต์) พ่น SaxException {ถ้า (qName.equals ("พนักงาน")) {return; } if (qname.equals ("พนักงาน")) {system.out.println (qName); } if (attributes.getLength ()> 0) {this.attributes = แอตทริบิวต์; this.hasattribute = true; }} โมฆะสาธารณะ endelement (สตริง uri, สตริง localname, สตริง qname) พ่น saxexception {ถ้า (hasattribute && (แอตทริบิวต์! = null)) {สำหรับ (int i = 0; i <attributes.getLength (); i ++) {system.out.println }}} อักขระโมฆะสาธารณะ (char [] ch, int start, ความยาว int) พ่น saxexception {system.out.println (สตริงใหม่ (ch, start, ความยาว)); -3. DOM4J สร้างและแยกวิเคราะห์เอกสาร XML
DOM4J เป็น Java XML API ที่ยอดเยี่ยมมากพร้อมประสิทธิภาพที่ยอดเยี่ยมฟังก์ชั่นที่ทรงพลังและใช้งานง่ายมากและยังเป็นซอฟต์แวร์โอเพ่นซอร์ส ทุกวันนี้คุณจะเห็นว่าซอฟต์แวร์ Java มากขึ้นเรื่อย ๆ กำลังใช้ DOM4J เพื่ออ่านและเขียน XML โดยเฉพาะอย่างยิ่งคุ้มค่าที่จะกล่าวถึงว่าแม้แต่ Jaxm ของ Sun ก็ใช้ DOM4J
นำเข้า 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; / ** * * @author Hongliang.dingHl * dom4j สร้างเอกสาร XML และการแยกวิเคราะห์เอกสาร XML */ คลาสสาธารณะ Dom4jdemo ใช้ Xmldocument {โมฆะสาธารณะ createxml (ชื่อไฟล์สตริง) {เอกสารเอกสาร = เอกสาร พนักงานองค์ประกอบ = document.addelement ("พนักงาน"); Element Employee = พนักงาน ADDELEMENT ("พนักงาน"); ชื่อองค์ประกอบ = พนักงาน. addelement ("ชื่อ"); name.settext ("ddvip"); Element Sex = Employee.Addelement ("Sex"); sex.settext ("M"); Element Age = Employee.Addelement ("อายุ"); age.settext ("29"); ลอง {Writer FileWriter = New FileWriter (ชื่อไฟล์); xmlWriter xmlWriter = ใหม่ xmlWriter (fileWriter); xmlwriter.write (เอกสาร); xmlwriter.close (); } catch (ioexception e) {system.out.println (e.getMessage ()); }} โมฆะสาธารณะ parserxml (ชื่อไฟล์สตริง) {ไฟล์ inputxml = ไฟล์ใหม่ (ชื่อไฟล์); saxReader saxReader = new SaxReader (); ลอง {document document = saxreader.read (inputxml); พนักงานองค์ประกอบ = document.getRootelement (); สำหรับ (iterator i = stompowion.elementiterator (); i.hasNext ();) {Element Employee = (Element) I.Next (); สำหรับ (iterator j = ExplueE.ElementIterator (); j.hasnext ();) {องค์ประกอบ node = (องค์ประกอบ) j.next (); System.out.println (node.getName ()+":"+node.getText ()); }}} catch (documentException e) {system.out.println (e.getMessage ()); } system.out.println ("dom4j parserxml"); -4. JDOM สร้างและแยกวิเคราะห์ XML
เพื่อลดจำนวนการเข้ารหัสของ DOM และ SAX JDOM ได้ปรากฏตัวขึ้น ข้อดี: หลักการ 20-80 ลดจำนวนรหัสอย่างมาก โอกาสในการใช้งาน: ฟังก์ชั่นที่จะนำไปใช้นั้นง่ายเช่นการแยกวิเคราะห์การสร้าง ฯลฯ แต่ที่ด้านล่าง JDOM ยังคงใช้ SAX (ใช้บ่อยที่สุด), DOM และเอกสาร Xanan
นำเข้า 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; / ** * * @author Hongliang.dingHl * JDOM สร้างและแยกวิเคราะห์เอกสาร XML * */ คลาสสาธารณะ JDOMDEMO ใช้ XMLDOCUMENT {โมฆะสาธารณะ createxml (ชื่อสตริงไฟล์) {เอกสารเอกสาร; รากองค์ประกอบ; root = องค์ประกอบใหม่ ("พนักงาน"); เอกสาร = เอกสารใหม่ (รูท); Element Employee = องค์ประกอบใหม่ ("พนักงาน"); root.addcontent (พนักงาน); ชื่อองค์ประกอบ = องค์ประกอบใหม่ ("ชื่อ"); name.settext ("ddvip"); พนักงาน. addcontent (ชื่อ); องค์ประกอบเพศ = องค์ประกอบใหม่ ("เพศ"); sex.settext ("M"); พนักงาน. addcontent (เพศ); Element Age = องค์ประกอบใหม่ ("อายุ"); age.settext ("23"); พนักงาน. addcontent (อายุ); XMLOUTPUTTER XMLOUT = ใหม่ XMLOUTPUTTER (); ลอง {xmlout.output (เอกสาร, ใหม่ fileOutputStream (ชื่อไฟล์)); } catch (filenotfoundException e) {e.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); }} โมฆะสาธารณะ parserxml (ชื่อไฟล์สตริง) {saxbuilder builder = saxbuilder ใหม่ (เท็จ); ลอง {document document = builder.build (ชื่อไฟล์); พนักงานองค์ประกอบ = document.getRootelement (); รายการพนักงาน = พนักงาน. getchildren ("พนักงาน"); สำหรับ (int i = 0; eElement Employee = (Element) Employeelist.get (i); list EmployeeInfo = Employee.getChildren (); สำหรับ (int j = 0; jsystem.out.println (((องค์ประกอบ) Employeeinfo.get (j)). getname () (jdomexception e) {e.printstacktrace ();ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น