บทนำ DOM4J
ที่อยู่โครงการของ DOM4J: http://sourceforge.net/projects/dom4j/?source=directory
DOM4J เป็นไลบรารีโอเพ่นซอร์สอย่างง่ายสำหรับการจัดการ XML, XPath และ XSLT
DOM4J ใช้ DOM4J หลังจากดาวน์โหลดโครงการ DOM4J แล้วคลายซิปและเพิ่มแพ็คเกจ JAR (เวอร์ชันปัจจุบันของฉันเรียกว่า DOM4J-1.6.1.JAR) ไปยังเส้นทางคลาส
(คุณสมบัติ-> Java Build Path-> เพิ่มขวดภายนอก ... )
จากนั้นคุณสามารถใช้ API ที่ให้ไว้สำหรับการเขียนโปรแกรม
ตัวอย่างโปรแกรม 1
โปรแกรมแรกใช้รหัส Java เพื่อสร้างเอกสาร XML และรหัสมีดังนี้:
แพ็คเกจ com.example.xml.dom4j; นำเข้า java.io.fileoutputstream; นำเข้า java.io.filewriter; นำเข้า org.dom4j.document; นำเข้า org.dom4j.documenthel ต่อ; นำเข้า org.dom4j.element; นำเข้า org.dom4j io .OutputFormat; นำเข้า org.dom4j.io.xmlWriter;/** * framework Dom4j เรียนรู้ที่จะใช้เฟรมเวิร์ก DOM4J เพื่อสร้างเอกสารและเอาต์พุต XML และบันทึก * */คลาสสาธารณะ Dom4JTest1 args) โยนข้อยกเว้น {// วิธีแรก: สร้างเอกสารและสร้างองค์ประกอบรูท // สร้างเอกสาร: ใช้เอกสารคลาส Helper = documentHelper.createDocument (); root = documenthelper.createelement ("st udent"); document2 = documenthelp er.createdocument (root2); ElementElement = Root2.Add Element ("World"); .writ e (เอกสาร); // เอาต์พุตไปยังไฟล์// รูปแบบ outputformat format = new OutputFormat ("", true); // ตั้งค่าการเยื้องเป็น 4 ช่องว่างและพฤติกรรมใหม่คือ XMLWriter XMLWriter2 = ใหม่ XMLWriter "Stud ent.xml"), รูปแบบ); xmlwriter2 .write (document2); FileWriter ("student2.xml"), รูปแบบ);
เอาต์พุตคอนโซลโปรแกรม:
<? xml version = "1.0" encoding = "utf-8"?> <นักเรียน/>
เอกสาร XML ที่สร้างขึ้น:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <student name = "zhangsan"> <helle> สวัสดีข้อความ </hello> <world> ข้อความโลก </world> </student>
ตัวอย่างโปรแกรม 2
ตัวอย่างโปรแกรม 2 อ่านเอกสาร XML และวิเคราะห์และส่งออกเนื้อหา
ขั้นแรกเอกสารที่จะวิเคราะห์มีดังนี้:
<? xml version = "1.0" encoding = "utf-8"?> <นักเรียนชื่อ = "zhangsan"> <hello name = "lisi"> สวัสดี text1 </hello> <hello name = "lisi2"> hello text2 < ::::::::::::::::::::::: กระทาน ::::::::::::::::::::::: กระทาน :::::::::::::::::::::::::::::::::::::::: กระทาน. "> World Text1 </world> <World Name =" Wangwu2 "> World Text2 </lorb World> <world> World Te XT3 </world> </students> แพ็คเกจ com.example.xml.dom4j; นำเข้า Java.io ไฟล์; นำเข้า java.util.iterator; นำเข้า java.util.list; นำเข้า Javax.xml.parsers .documentBuilder; นำเข้า Javax .dom4j.io.domreader; นำเข้า org.dom4j.io.saxread er;/** * dom4j เฟรมเวิร์กการเรียนรู้: อ่านและแยกวิเคราะห์ xml * * */คลาสสาธารณะ dom4jtest2 {โมฆะสาธารณะคงที่หลัก (สตริง [] args) โยนข้อยกเว้น { SaxReader SaxReader = new SaxReader (); เอกสารเอกสาร = SaxReader.Read (ไฟล์ใหม่ ("students.xml")); " + root.getName ()); // รับรายการองค์ประกอบลูกทั้งหมด <องค์ประกอบ> childList = root.elements (); System. out.println (" จำนวนเด็กทั้งหมด: " + childList.size ()); // รับ องค์ประกอบลูกของรายการชื่อเฉพาะ <องค์ประกอบ> childList2 = root.elements ("Hello"); องค์ประกอบชื่อที่ระบุ FirstWorldElement = root.element ("World"); AttributeEvalue ("ชื่อ")); ตัววนซ้ำ = root.elementiterator (); println ("ใช้ domreader --------------------------------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------ DocumentBuilderFactory DBF = DocumentBuilderFactory.NewInstance (); w3c.dom.document ควรใช้ document2 = db.parse (ไฟล์ใหม่ ("students.xml")); Element RootElement = document3.get getElement ();
หลังจากเรียกใช้รหัสเอาต์พุตคือ:
รูท: นักเรียนจำนวนเด็กจำนวน: 6 เฮลโลเด็ก: 3 วินาทีโลกที่ดีกว่า: ชื่อ = วังวูเอาท์พุทซ้ำ -------------------------------------------------------------------------------------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ---------------------------------- ader ------ ------ ------ ------------------ รูท: นักเรียน
SAX PARSES XML
ต่อไปนี้เป็นขั้นตอนในการใช้การแยกวิเคราะห์เอนทิตีใน SAX
// ต่อไปนี้เป็น XMLREADER TO PARSE (i) ขั้นตอนที่ 1: สร้างคลาสโรงงานใหม่ SaxParSerFactory รหัสมีดังนี้:
SaxParserFactory Factory = SaxParserFactory.NewInstance ();
(2) ขั้นตอนที่ 2: ให้คลาสโรงงานสร้าง Saxparser คลาส Sax Parser, รหัสมีดังนี้:
saxparser parser = factory.newsaxparser ();
(iii) ขั้นตอนที่ 3: รับอินสแตนซ์ xmlreader จาก Saxpsrser, รหัสมีดังนี้:
xmlreader reader = parser.getxmlreader ();
(4) ขั้นตอนที่ 4: ลงทะเบียนตัวจัดการที่คุณเขียนใน XMLREADER
Reader.SetContentHandler (นี่);
(v) ขั้นตอนที่ 5: หลังจากเปลี่ยนเอกสารหรือทรัพยากร XML เป็นสตรีมอินพุตที่ Java สามารถประมวลผลได้การแยกวิเคราะห์เริ่มต้นอย่างเป็นทางการและรหัสมีดังนี้:
reader.parse (InputSource ใหม่ (IS));
// ต่อไปนี้คือการใช้ saxparser เพื่อแยกวิเคราะห์ (i) ขั้นตอนแรก: สร้างคลาสโรงงานใหม่ SaxparserFactory รหัสมีดังนี้:
SaxParserFactory Factory = SaxParserFactory.NewInstance ();
(2) ขั้นตอนที่ 2: ให้คลาสโรงงานสร้าง Saxparser คลาส Sax Parser, รหัสมีดังนี้:
saxparser parser = factory.newsaxparser ();
(3) ขั้นตอนที่ 3: หลังจากเปลี่ยนเอกสารหรือทรัพยากร XML เป็นสตรีมอินพุตที่ Java สามารถประมวลผลได้การแยกวิเคราะห์เริ่มต้นอย่างเป็นทางการและรหัสมีดังนี้:
parser.parse (คือนี่);
ฉันเดาว่าทุกคนได้เห็น ContentHandler
// ตั้งค่าวัตถุ locator ที่สามารถค้นหาตำแหน่งที่เหตุการณ์เนื้อหาเอกสารเกิดขึ้น
โมฆะสาธารณะ SetDocumentLocator (ตัวระบุตำแหน่ง)
// ใช้เพื่อจัดการเหตุการณ์เริ่มต้นการแยกวิเคราะห์เอกสาร
โมฆะสาธารณะ startDocument () พ่น SaxException
// ประมวลผลเหตุการณ์เริ่มต้นองค์ประกอบและคุณสามารถรับ URI, ชื่อองค์ประกอบ, ตารางคลาสแอตทริบิวต์และข้อมูลอื่น ๆ ของเนมสเปซที่องค์ประกอบอยู่จากพารามิเตอร์
การเริ่มต้นโมฆะสาธารณะ (สตริง namespacesuri, สตริง localname, สตริง qname, แอตทริบิวต์ atts) พ่น saxexception
// จัดการเหตุการณ์สิ้นสุดองค์ประกอบและคุณสามารถรับ URI, ชื่อองค์ประกอบและข้อมูลอื่น ๆ ของเนมสเปซที่องค์ประกอบอยู่จากพารามิเตอร์
โมฆะสาธารณะ endlement (สตริง namespacesuri, สตริง localname, สตริง qname) พ่น saxexception
// ประมวลผลเนื้อหาอักขระขององค์ประกอบและคุณสามารถรับเนื้อหาจากพารามิเตอร์
ตัวละครโมฆะสาธารณะ (char [] ch, int start, ความยาว int) พ่น Saxexception
โดยวิธีการแนะนำวิธีการใน XMLREADER
// ลงทะเบียนและจัดการกับเอกสาร XML Parsing Event Event ContentHandler
โมฆะสาธารณะ SetContentHandler (ContentHandler Handler)
// เริ่มแยกวิเคราะห์เอกสาร XML
Public Void Parse (อินพุตอินพุต) พ่น SaxException
ฉันพูดเสร็จโดยคร่าวๆ
com.example.demo; นำเข้า Java.io.serializable; ) {return _id;} โมฆะสาธารณะ set_id (สตริง _id) {this._id = _id; () {return _age;} โมฆะสาธารณะ set_age (สตริง _age) {this._age = _age
ต่อไปเราต้องการใช้ contenthandler เพื่อแยก XML
การใช้งาน ContentHandler โดยทั่วไปต้องใช้ขั้นตอนต่อไปนี้
1. ประกาศชั้นเรียนและสืบทอด defaulthandler Defaulthandler เป็นคลาสพื้นฐานซึ่งใช้ ContentHandler เราแค่ต้องเขียนวิธีการใหม่ภายใน
2. การเขียน startDocument () และ enddocument ()
3. การเขียนใหม่ startElement () บ่อยครั้งที่ข้อมูลบางอย่างดำเนินการในฟังก์ชั่นนี้โดยการตัดสินคุณค่าของชื่อท้องถิ่น
4. วิธีการเขียนอักขระ () ใหม่ซึ่งเป็นวิธีการโทรกลับ หลังจากตัวแยกวิเคราะห์ได้ดำเนินการเริ่มต้น () วิธีนี้จะถูกดำเนินการหลังจากแยกวิเคราะห์เนื้อหาของโหนดและพารามิเตอร์ ch [] เป็นเนื้อหาของโหนด
5. วิธีการเขียนใหม่ของ endelement () defaulthandler และเขียนวิธีต่อไปนี้อีกครั้ง
Public Class SAX_PARSERXML ขยาย defaulthandler { / *** เหตุการณ์นี้จะถูกเรียกใช้เมื่อแยกวิเคราะห์ไฟล์ XML Method Stub Super.StartDocument ();} / *** เหตุการณ์นี้จะถูกเรียกใช้เมื่อแยกวิเคราะห์แท็กเริ่มต้นขององค์ประกอบ** / @Override โมฆะสาธารณะเริ่มต้น (สตริง uri, สตริง localname, string qn ame, แอตทริบิวต์แอตทริบิวต์) {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub super.startelement (uri, localname, qname, แอตทริบิวต์); ] ch, int start, ความยาว int) พ่น saxexception {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub super.characters (ch, start, ความยาว); @Override โมฆะสาธารณะ Endelement (String uri, String localName, String qname) พ่น Saxexception {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub super.endelement t (uri, localname, qname);
ก่อนอื่นเราสร้างรายการเพื่อบันทึกข้อมูลบุคคลที่แยกวิเคราะห์
รายการ <person> บุคคล;
แต่? จะเริ่มต้นที่ไหน? เราสามารถเริ่มต้นมันใน startDocument () เนื่องจากเหตุการณ์นี้จะถูกเรียกใช้เมื่อแยกวิเคราะห์การประกาศของไฟล์ XML ดังนั้นจึงเหมาะสมกว่าที่จะวางไว้ที่นี่
/ *** เหตุการณ์นี้จะถูกทริกเกอร์เมื่อแยกวิเคราะห์ไฟล์ XML );
ต่อไปเราจะเริ่มวิเคราะห์
/ *** เหตุการณ์นี้จะถูกทริกเกอร์เมื่อแยกวิเคราะห์แท็กเริ่มต้นขององค์ประกอบ**/ @Override โมฆะสาธารณะเริ่มต้น (สตริง uri, สตริง localname, สตริง qname, แอตทริบิวต์แอตทริบิวต์) โยน saxexception {// .StartElement (uri, localname, qname, แอตทริบิวต์); Attributes.getValue ("id"));
ในรหัสด้านบนชื่อ localName แสดงชื่อองค์ประกอบที่แยกวิเคราะห์ในปัจจุบัน
// step // 1 ** * เหตุการณ์นี้เกิดขึ้นเมื่ออ่านองค์ประกอบข้อความ , เริ่มต้น, ความยาว); ถ้า (บุคคล! = null) {// ดึงค่าที่สอดคล้องกับสตริงองค์ประกอบปัจจุบัน txt = สตริงใหม่ (ch, เริ่ม Equals ("Name")) {// เพิ่มค่าที่ดึงออกมาให้กับบุคคลที่เป็นวัตถุ set_name (txt);
ถัดไปคือสิ่งที่คุณต้องทำเมื่อแท็กสิ้นสุดลง
/ *** เหตุการณ์นี้จะถูกทริกเกอร์เมื่อแท็กสุดท้ายอ่าน**/ @Override โมฆะสาธารณะ endlement (สตริง uri, สตริง localname, สตริง qname) โยน saxexception {// todo วิธีการระเบิดอัตโนมัติ stub super.endelement (uri , localname, qname); ::::::::::::::::::::::: กระทาน :::::::::::::::::::::00
การวิเคราะห์อาจเป็นกระบวนการ
1. วิธีการเริ่มต้นจะถูกเรียกที่จุดเริ่มต้นขององค์ประกอบ
2. วิธีการอักขระจะถูกเรียกต่อไปซึ่งสามารถใช้เพื่อรับค่าขององค์ประกอบ
3. เมื่อองค์ประกอบสิ้นสุดวิธีการ endelement จะถูกเรียกหลังจากการแยกวิเคราะห์เสร็จสิ้น
รายการสาธารณะ <person> readxml (InputStream คือ) {SaxParserFactory Factory = SaxParserFactory.NewInstance (); วิธีที่สอง xmlreader reader = parser.getxmlreader (); คนกลับมา;
รหัสข้างต้นไม่ได้อธิบาย
com.example.demo.utils; .xml.sax.attributes; . Demo.Person; SaxParser Parser = โรงงาน NewSaxParser (); (InputSource ใหม่ (IS)); คุณสามารถทำงานเริ่มต้นได้บ้าง* / @Override โมฆะสาธารณะ startDocument () พ่น SaxException {// วิธีการที่สร้างขึ้นอัตโนมัติ stub Super.startDocument (); * * เหตุการณ์นี้จะถูกทริกเกอร์เมื่อแยกวิเคราะห์แท็กเริ่มต้นขององค์ประกอบ * */ @Override โมฆะสาธารณะเริ่มต้น (สตริง uri, สตริง localname, สตริง qname, แอตทริบิวต์แอตทริบิวต์) โยน sa xexception {// toDo วิธีการที่สร้างอัตโนมัติ startelement (uri, localname, qname, attributes); .getValue ("id"));} curnode = localName; พ่น SAXEXC Episode {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub super.characters (ch, start, ความยาว); เริ่มต้นความยาว); "อายุ")) {บุคคล พ่น Saxexc Episode {// todo วิธีการที่สร้างขึ้นอัตโนมัติ super.endelement (uri, localname, qname); บุคคล!
เขียนวิธีการเรียกคลาสนี้
รายการ <person> person = new sax_parserxml (). readxml (IS); ); .get_age () + "/n");} toast.maketext (กิจกรรม, บัฟเฟอร์, toast.length_long)
หากคุณเห็นคำอธิบายอินเทอร์เฟซต่อไปนี้การวิเคราะห์ประสบความสำเร็จ ~
สรุป:
การแยกวิเคราะห์ DOM (ไฟล์ออบเจ็กต์ไฟล์): ตัวแยกวิเคราะห์อ่านเอกสารทั้งหมดจากนั้นสร้างโครงสร้างแผนผังต้นไม้ที่อยู่อาศัยหน่วยความจำและรหัสสามารถใช้งานโครงสร้างต้นไม้นี้ได้ตามอินเตอร์เฟส DOM
ข้อดี: เอกสารทั้งหมดถูกอ่านลงในหน่วยความจำสะดวกในการใช้งาน: รองรับฟังก์ชั่นต่าง ๆ เช่นการดัดแปลงการลบและการทำซ้ำและการจัดเรียง
ข้อเสีย: อ่านเอกสารทั้งหมดเป็นหน่วยความจำรักษาโหนดที่ไม่จำเป็นมากเกินไปการสูญเสียหน่วยความจำและพื้นที่
โอกาสในการใช้งาน: เมื่ออ่านเอกสารแล้วเอกสารจะต้องดำเนินการหลายครั้งและเมื่อทรัพยากรฮาร์ดแวร์เพียงพอ (หน่วยความจำ, CPU)
เพื่อที่จะแก้ปัญหาที่มีอยู่ในการแยกวิเคราะห์ DOM การแยกวิเคราะห์แซ็กโซโฟนเกิดขึ้น ลักษณะของมันคือ:
ข้อดี: ไม่จำเป็นต้องใช้เอกสารทั้งหมดซึ่งใช้ทรัพยากรน้อยลง โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมที่ฝังตัวเช่น Android ขอแนะนำให้ใช้การแยกวิเคราะห์แซ็กโซโฟน
ข้อเสีย: ซึ่งแตกต่างจากการแยกวิเคราะห์ DOM ข้อมูลไม่คงอยู่ หากข้อมูลไม่ได้ถูกบันทึกหลังจากเหตุการณ์ข้อมูลจะหายไป
ใช้โอกาส: เครื่องมีข้อ จำกัด ด้านประสิทธิภาพ