1. DOM (JAXP Crimson Parser)
DOM เป็นมาตรฐาน W3C อย่างเป็นทางการสำหรับการเป็นตัวแทนเอกสาร XML ในลักษณะที่เป็นอิสระจากแพลตฟอร์มและภาษา DOM เป็นชุดของโหนดหรือชิ้นส่วนข้อมูลที่จัดขึ้นในลำดับชั้น ลำดับชั้นนี้ช่วยให้นักพัฒนาค้นหาข้อมูลเฉพาะในต้นไม้ การวิเคราะห์โครงสร้างนี้มักจะต้องมีการโหลดเอกสารทั้งหมดและสร้างลำดับชั้นก่อนที่จะสามารถทำงานได้ เนื่องจากมันขึ้นอยู่กับระดับข้อมูล DOM จึงถูกพิจารณาว่าเป็นแบบต้นไม้หรือวัตถุ การประมวลผลตามต้นไม้และทั่วไปมีข้อดีหลายประการ ครั้งแรกเนื่องจากต้นไม้มีความสำคัญต่อเนื่องในหน่วยความจำจึงสามารถแก้ไขได้เพื่อให้แอปพลิเคชันสามารถเปลี่ยนแปลงข้อมูลและโครงสร้างได้ นอกจากนี้ยังช่วยให้คุณสามารถนำทางขึ้นและลงต้นไม้ได้ตลอดเวลาแทนที่จะเป็นงานครั้งเดียวเช่นแซ็กโซโฟน DOM ใช้งานง่ายกว่ามาก
2. แซ็กโซโฟน
ข้อดีของการประมวลผล SAX นั้นคล้ายคลึงกับข้อดีของการสตรีม การวิเคราะห์สามารถเริ่มต้นได้ทันทีแทนที่จะรอข้อมูลทั้งหมดที่จะประมวลผล และเนื่องจากแอปพลิเคชันตรวจสอบข้อมูลเมื่ออ่านมันจึงไม่จำเป็นต้องจัดเก็บข้อมูลในหน่วยความจำ นี่เป็นข้อได้เปรียบอย่างมากสำหรับเอกสารขนาดใหญ่ ในความเป็นจริงแอปพลิเคชันไม่จำเป็นต้องแยกวิเคราะห์เอกสารทั้งหมด มันสามารถหยุดการแยกวิเคราะห์เมื่อพบเงื่อนไขบางอย่าง โดยทั่วไปแล้วแซ็กโซโฟนเร็วกว่า DOM ทดแทนมาก
เลือก DOM หรือ SAX? สำหรับนักพัฒนาที่ต้องการเขียนรหัสของตัวเองเพื่อประมวลผลเอกสาร XML การเลือกรูปแบบการแยกวิเคราะห์ DOM หรือ SAX เป็นการตัดสินใจออกแบบที่สำคัญมาก DOM ใช้วิธีการสร้างโครงสร้างต้นไม้เพื่อเข้าถึงเอกสาร XML ในขณะที่ SAX ใช้โมเดลเหตุการณ์
ตัวแยกวิเคราะห์ DOM แปลงเอกสาร XML เป็นต้นไม้ที่มีเนื้อหาและสามารถสำรวจต้นไม้ได้ ข้อดีของการแยกวิเคราะห์แบบจำลองด้วย DOM คือการเขียนโปรแกรมง่าย นักพัฒนาจำเป็นต้องโทรหาคำแนะนำในการทำต้นไม้แล้วใช้ API นำทางเพื่อเข้าถึงโหนดต้นไม้ที่ต้องการเพื่อให้งานเสร็จสมบูรณ์ มันง่ายที่จะเพิ่มและแก้ไของค์ประกอบในต้นไม้ อย่างไรก็ตามเนื่องจากเอกสาร XML ทั้งหมดจำเป็นต้องได้รับการประมวลผลเมื่อใช้ตัวแยกวิเคราะห์ DOM ความต้องการประสิทธิภาพและหน่วยความจำจึงค่อนข้างสูงโดยเฉพาะอย่างยิ่งเมื่อพบไฟล์ XML ขนาดใหญ่ เนื่องจากความสามารถในการเดินทางผ่านตัวแยกวิเคราะห์ DOM มักจะใช้ในบริการที่เอกสาร XML ต้องการการเปลี่ยนแปลงบ่อยครั้ง
ตัวแยกวิเคราะห์แซ็กโซโฟนใช้โมเดลตามเหตุการณ์ มันสามารถกระตุ้นชุดของเหตุการณ์เมื่อแยกวิเคราะห์เอกสาร XML เมื่อพบแท็กที่กำหนดจะสามารถเปิดใช้งานวิธีการโทรกลับเพื่อบอกวิธีที่พบแท็ก SAX มักจะต้องใช้หน่วยความจำต่ำเพราะช่วยให้นักพัฒนาตัดสินใจแท็กที่ต้องการประมวลผล โดยเฉพาะอย่างยิ่งเมื่อนักพัฒนาจำเป็นต้องประมวลผลส่วนหนึ่งของข้อมูลที่มีอยู่ในเอกสารความสามารถในการขยายตัวของแซ็กโซโฟนสะท้อนให้เห็นได้ดีขึ้น อย่างไรก็ตามการเข้ารหัสเป็นเรื่องยากเมื่อใช้ตัวแยกวิเคราะห์ SAX และเป็นการยากที่จะเข้าถึงข้อมูลที่แตกต่างกันหลายรายการในเอกสารเดียวกันในเวลาเดียวกัน
3. jdom http://www.jdom.org
จุดประสงค์ของ JDOM คือการเป็นโมเดลเอกสารเฉพาะ Java ซึ่งทำให้การโต้ตอบกับ XML ง่ายขึ้นและเร็วกว่าการใช้ DOM เนื่องจากเป็นรูปแบบเฉพาะของ Java ครั้งแรก JDOM จึงได้รับการส่งเสริมและส่งเสริมอย่างจริงจัง เมื่อพิจารณาถึงการใช้มันเป็น "ส่วนขยายมาตรฐาน Java" ผ่าน "คำขอข้อมูลจำเพาะ Java JSR-102" การพัฒนา JDOM เริ่มต้นตั้งแต่ต้นปี 2000
JDOM และ DOM ส่วนใหญ่แตกต่างกันในสองด้าน ก่อนอื่น JDOM ใช้คลาสคอนกรีตเท่านั้นและไม่ใช่อินเทอร์เฟซ สิ่งนี้ทำให้ API ง่ายขึ้นในบางวิธี แต่ยังจำกัดความยืดหยุ่น ประการที่สอง API ใช้คลาสคอลเลกชันจำนวนมากทำให้การใช้งานของนักพัฒนา Java ง่ายขึ้นซึ่งคุ้นเคยกับชั้นเรียนเหล่านี้แล้ว
เอกสาร JDOM ระบุว่าจุดประสงค์ของมันคือ "ใช้ความพยายาม 20% (หรือน้อยกว่า) ในการแก้ปัญหา Java/XML" (หรือมากกว่า) (หรือมากกว่า) (สันนิษฐานว่าเป็น 20% ตามเส้นโค้งการเรียนรู้) แน่นอนว่า JDOM มีประโยชน์สำหรับแอปพลิเคชัน Java/XML ส่วนใหญ่และนักพัฒนาส่วนใหญ่พบว่า APIs เข้าใจง่ายกว่า DOM มาก JDOM ยังรวมถึงการตรวจสอบพฤติกรรมของโปรแกรมอย่างกว้างขวางเพื่อป้องกันไม่ให้ผู้ใช้ทำอะไรที่ไม่มีความหมายใน XML อย่างไรก็ตามมันยังต้องการให้คุณเข้าใจ XML อย่างเต็มที่เพื่อทำอะไรบางอย่างนอกเหนือจากพื้นฐาน (หรือเข้าใจข้อผิดพลาดในบางกรณี) นี่อาจเป็นงานที่มีความหมายมากกว่าการเรียนรู้อินเทอร์เฟซ DOM หรือ JDOM
JDOM เองไม่มีตัวแยกวิเคราะห์ มันมักจะใช้ตัวแยกวิเคราะห์ SAX2 เพื่อแยกวิเคราะห์และตรวจสอบเอกสารอินพุต XML (แม้ว่ามันจะสามารถใช้การแสดง DOM ที่สร้างขึ้นก่อนหน้านี้เป็นอินพุต) มันมีตัวแปลงบางตัวเพื่อแสดงผลการแสดง JDOM ลงในสตรีมเหตุการณ์ SAX2, โมเดล DOM หรือเอกสารข้อความ XML JDOM เป็นโอเพ่นซอร์สที่เปิดตัวภายใต้ตัวแปรใบอนุญาต Apache
4. dom4j http://dom4j.sourceforge.net
แม้ว่า DOM4J จะแสดงถึงผลการพัฒนาที่เป็นอิสระอย่างสมบูรณ์ แต่ในขั้นต้นมันเป็นสาขาอัจฉริยะของ JDOM มันรวมคุณสมบัติมากมายนอกเหนือจากการแสดงเอกสาร XML พื้นฐานรวมถึงการสนับสนุน XPATH แบบรวมการสนับสนุน XML Schema และการประมวลผลตามเหตุการณ์สำหรับเอกสารขนาดใหญ่หรือสตรีม นอกจากนี้ยังมีตัวเลือกในการสร้างการแสดงเอกสารซึ่งมีการเข้าถึงแบบขนานผ่าน DOM4J API และอินเตอร์เฟส DOM มาตรฐาน มันอยู่ระหว่างการพัฒนามาตั้งแต่ครึ่งหลังของปี 2000
เพื่อรองรับคุณสมบัติทั้งหมดเหล่านี้ DOM4J ใช้อินเทอร์เฟซและวิธีการคลาสพื้นฐานที่เป็นนามธรรม DOM4J ใช้คลาสคอลเลกชันใน API อย่างกว้างขวาง แต่ในหลายกรณีมันยังมีทางเลือกบางอย่างเพื่อให้ประสิทธิภาพที่ดีขึ้นหรือวิธีการเข้ารหัสที่ตรงไปตรงมามากขึ้น ผลประโยชน์โดยตรงคือในขณะที่ DOM4J จ่ายราคาของ API ที่ซับซ้อนมากขึ้น แต่ก็ให้ความยืดหยุ่นมากกว่า JDOM
เมื่อเพิ่มความยืดหยุ่นการรวม XPATH และเป้าหมายของการประมวลผลเอกสารขนาดใหญ่ DOM4J นั้นเหมือนกับ JDOM: ความสะดวกในการใช้งานและการใช้งานที่ใช้งานง่ายสำหรับนักพัฒนา Java นอกจากนี้ยังมุ่งมั่นที่จะกลายเป็นทางออกที่สมบูรณ์มากกว่า JDOM บรรลุเป้าหมายในการจัดการกับปัญหา Java/XML ทั้งหมดในธรรมชาติ เมื่อบรรลุเป้าหมายนี้จะเน้นการเน้นการป้องกันพฤติกรรมแอปพลิเคชันที่ไม่ถูกต้องน้อยกว่า JDOM
DOM4J เป็น Java XML API ที่ยอดเยี่ยมมากพร้อมประสิทธิภาพที่ยอดเยี่ยมฟังก์ชั่นที่ทรงพลังและใช้งานง่ายมาก นอกจากนี้ยังเป็นซอฟต์แวร์โอเพ่นซอร์ส ทุกวันนี้คุณจะเห็นว่าซอฟต์แวร์ Java มากขึ้นเรื่อย ๆ กำลังใช้ DOM4J เพื่ออ่านและเขียน XML โดยเฉพาะอย่างยิ่งคุ้มค่าที่จะกล่าวถึงว่าแม้แต่ Jaxm ของ Sun ก็ใช้ DOM4J
การเปรียบเทียบสี่วิธี
DOM4J มีประสิทธิภาพที่ดีที่สุดและแม้แต่ JAXM ของ Sun ก็ใช้ DOM4J ปัจจุบันโครงการโอเพ่นซอร์สจำนวนมากใช้ DOM4J ในปริมาณมากเช่นไฮเบอร์เนตที่มีชื่อเสียงยังใช้ DOM4J เพื่ออ่านไฟล์การกำหนดค่า XML หากไม่ได้รับการพิจารณาการพกพาจะใช้ DOM4J
JDOM และ DOM ทำงานได้ไม่ดีในระหว่างการทดสอบประสิทธิภาพหน่วยความจำล้นเมื่อทดสอบเอกสาร 10m นอกจากนี้ยังคุ้มค่าที่จะพิจารณา DOM และ JDOM ในกรณีของเอกสารขนาดเล็ก ในขณะที่นักพัฒนา JDOM ระบุว่าพวกเขาคาดว่าจะมุ่งเน้นไปที่ปัญหาด้านประสิทธิภาพก่อนที่จะมีการเปิดตัวอย่างเป็นทางการจากมุมมองประสิทธิภาพ แต่ก็ไม่ได้แนะนำจริงๆ นอกจากนี้ DOM ยังคงเป็นตัวเลือกที่ดีมาก การใช้งาน DOM นั้นใช้กันอย่างแพร่หลายในภาษาการเขียนโปรแกรมที่หลากหลาย นอกจากนี้ยังเป็นพื้นฐานของมาตรฐานที่เกี่ยวข้องกับ XML อื่น ๆ อีกมากมายเนื่องจากเป็นคำแนะนำอย่างเป็นทางการของ W3C (ตรงข้ามกับโมเดล Java ที่ไม่ได้มาตรฐาน) ดังนั้นจึงอาจจำเป็นในบางประเภทของโครงการเช่นกัน (เช่นการใช้ DOM ใน JavaScript)
SAX ทำงานได้ดีขึ้นซึ่งขึ้นอยู่กับวิธีการแยกวิเคราะห์ที่เฉพาะเจาะจง - ขับเคลื่อนเหตุการณ์ แซ็กโซโฟนตรวจจับสตรีม XML ที่กำลังจะมาถึง แต่ไม่ได้โหลดลงในหน่วยความจำ (แน่นอนเมื่ออ่าน XML สตรีมเอกสารบางฉบับจะถูกซ่อนไว้ในหน่วยความจำชั่วคราว)
การใช้วิธีการใช้ XML ขั้นพื้นฐานสี่วิธี
ไฟล์ XML:
<? xml version = "1.0" การเข้ารหัส = "gb2312"?> <ผลลัพธ์> <ค่า> <no> a1234 </no> <addr> ไม่ xx ส่วน XX Road, XX Town, XX County, Sichuan Province </addr> </มูลค่า> </addr> </value> </ผลลัพธ์>
1) วิธีการใช้งาน DOM
นำเข้า java.io.*; นำเข้า java.util.*; นำเข้า org.w3c.dom.*; นำเข้า Javax.xml.parsers.*; คลาสสาธารณะ myxmlreader {โมฆะคงที่สาธารณะ ลอง {ไฟล์ f = ไฟล์ใหม่ ("data_10k.xml"); DocumentBuilderFactory Factory = DocumentBuilderFactory.NewInstance (); DocumentBuilder Builder = Factory.newDocumentBuilder (); เอกสารเอกสาร = builder.parse (f); NodeList NL = doc.getElementByTagname ("value"); สำหรับ (int i = 0; i <nl.getLength (); i ++) {system.out.print ("หมายเลขป้ายทะเบียน:"+doc.getElementsByTagname ("ไม่") รายการ (i) .getFirstChild () getNodeValue ()); System.out.println ("ที่อยู่ของเจ้าของ:" + doc.getElementsByTagname ("addr") รายการ (i) .getFirstChild (). getNodeValue ()); }} catch (exception e) {e.printstacktrace ();} 2) วิธีการใช้งาน SAX
นำเข้า org.xml.sax.*; นำเข้า org.xml.sax.helpers.*; นำเข้า Javax.xml.parsers.*; คลาสสาธารณะ Myxmlreader ขยาย defaulthandler {java.util.stack แท็ก = ใหม่ java.util.stack (); สาธารณะ myxmlreader () {super ();} โมฆะคงที่สาธารณะหลัก (สตริง args []) {ยาวนาน = system.currentTimeMillis (); ลอง {saxparserfactory sf = saxparserfactory.newinstance (); saxparser sp = sf.newsaxparser (); myxmlreader reader = new myxmlreader (); sp.parse (InputSource ใหม่ ("data_10k.xml"), reader); } catch (exception e) {e.printstacktrace (); } system.out.println ("เวลาทำงาน:" + (System.currentTimeMillis () - ยั่งยืน) + "มิลลิวินาที");} อักขระโมฆะสาธารณะ (char ch [], int start, ความยาว int) โยน saxexception {String tag = (String) tags.peek (); if (tag.equals ("no")) {system.out.print ("หมายเลขป้ายทะเบียน:" + สตริงใหม่ (ch, start, ความยาว));} ถ้า (tag.equals ("addr")) {system.out.println (ที่อยู่: "สตริงใหม่ tags.push (qname);}} 3) วิธีการใช้งาน JDOM
นำเข้า java.io.*; นำเข้า java.util.*; นำเข้า org.jdom.*; นำเข้า org.jdom.input.*; คลาสสาธารณะ myxmlreader {โมฆะคงที่สาธารณะหลัก (สตริง arge []) ลอง {saxbuilder builder = new SaxBuilder (); เอกสารเอกสาร = builder.build (ไฟล์ใหม่ ("data_10k.xml")); Element Foo = doc.getRootelement (); แสดงรายการ AllChildren = foo.getChildren (); สำหรับ (int i = 0; i <allchildren.size (); i ++) {system.out.print ("หมายเลขป้ายทะเบียน:"+((องค์ประกอบ) allchildren.get (i)). getChild ("ไม่"). getText ()); System.out.println ("ที่อยู่ของเจ้าของ:" + ((องค์ประกอบ) allchildren.get (i)). getChild ("addr"). getText ()); }} catch (Exception E) {E.printStackTrace ();}} 4) วิธีการใช้งาน DOM4J
นำเข้า java.io.*; นำเข้า java.util.*; นำเข้า org.dom4j.*; นำเข้า org.dom4j.io.*; คลาสสาธารณะ myxmlreader {โมฆะคงที่สาธารณะหลัก (สตริง arge []) ลอง {ไฟล์ f = ไฟล์ใหม่ ("data_10k.xml"); saxReader reader = new SaxReader (); เอกสารเอกสาร = reader.read (f); Element root = doc.getRootelement (); องค์ประกอบฟู; สำหรับ (iterator i = root.elementiterator ("value"); i.hasnext () {foo = (องค์ประกอบ) i.next (); system.out.print ("หมายเลขป้ายทะเบียน:" + foo.elementtext ("ไม่"); system.out.println ("ที่อยู่ของเจ้าของ:" E.PrintStackTrace ();})