ตัวแยกวิเคราะห์ XML ที่ดีที่สุดสำหรับ Java [ปิด]


387

ฉันจำเป็นต้องอ่านไฟล์ XML ขนาดเล็กที่สุด (ไม่กี่ MB, เข้ารหัส UTF-8), ค้นหารอบ ๆ องค์ประกอบและคุณสมบัติต่าง ๆ อาจแก้ไขบางอย่างและเขียน XML กลับออกไปที่ดิสก์อีกครั้ง .

ตัวแยกวิเคราะห์ XML ที่ดีที่สุดสำหรับความต้องการของฉันคืออะไร มีให้เลือกมากมาย บางอย่างที่ฉันรู้คือ:

และแน่นอนหนึ่งใน JDK (ฉันใช้ Java 6) ฉันคุ้นเคยกับ Xerces แต่พบว่ามันไม่น่าสนใจ

ข้อเสนอแนะ?


6
ฉันคิดว่าคุณสามารถหาผู้เล่นเพิ่มเติมได้ที่นี่: xml.com/lpt/a/1703
dma_k

1
ฉันคิดว่ามีปัญหาจริงกับคำถามนี้ 1 คือมันเป็นการเปรียบเทียบโดยสิ้นเชิงต่างจากสิ่งของ larsing lumping parsers (xerces, crimson) พร้อมกับ dom-manipulation libraries (dom4j, xom, jdom) คำตอบก็มีแนวโน้มที่จะสนับสนุนและไม่ใช่สิ่งที่สร้างสรรค์
Nathan Hughes

51
+220 และไม่สร้างสรรค์ ผู้ดูแลและผู้ใช้อย่างชัดเจนมีมุมมองที่แตกต่างกันในสิ่งที่สร้างสรรค์
tbroberg

5
ใช่ดูเหมือนว่า mods จะถูกมองข้ามเมื่อมีคำถามเช่นนี้ ใช่คำตอบจะได้รับการให้ความเห็น แต่แน่นอนขึ้นอยู่กับประสบการณ์ Mods จำเป็นต้องสร้างแท็กที่แตกต่างกันเพื่อย้ายคำถามนี้ซึ่งเปิดสำหรับการอภิปรายซึ่งส่งผลให้เกิดการวิจารณ์ที่สร้างสรรค์และผลลัพธ์
Ashraff Ali Wahab

@dma_k ลิงก์ของคุณไม่ทำงาน
gaurav

คำตอบ:


81

หากความเร็วและหน่วยความจำไม่มีปัญหาdom4jเป็นตัวเลือกที่ดีจริงๆ หากคุณต้องการความเร็วการใช้ตัวแยกวิเคราะห์ StAX เช่นWoodstoxเป็นวิธีที่ถูกต้อง แต่คุณต้องเขียนโค้ดเพิ่มเติมเพื่อให้เสร็จลุล่วงและคุณต้องคุ้นเคยกับการประมวลผล XML ในสตรีม


6
dom4j ค่อนข้างดี แต่ก็ไม่มีปัญหาแน่นอน สำหรับทางเลือก dom4j ที่ดีให้ดูที่stackoverflow.com/questions/831865/…
Jonik

@zehrer พวกเขาปลอดภัยไหม?
gaurav

257

ฉันคิดว่าคุณไม่ควรพิจารณาการใช้เครื่องมือแยกวิเคราะห์เฉพาะ Java API สำหรับการประมวลผล XMLช่วยให้คุณใช้การแยกวิเคราะห์ตามวิธีมาตรฐานได้ รหัสควรจะพกพาได้มากกว่าเดิมและเมื่อคุณทราบว่าตัวแยกวิเคราะห์เฉพาะรุ่นเก่าเกินไปคุณสามารถแทนที่ได้ด้วยตัวอื่นโดยไม่ต้องเปลี่ยนบรรทัดรหัสของคุณ (ถ้าคุณทำอย่างถูกต้อง)

โดยทั่วไปมีสามวิธีในการจัดการ XML ในวิธีมาตรฐาน:

  • SAXนี่คือ API ที่ง่ายที่สุด คุณอ่าน XML โดยการกำหนดคลาสตัวจัดการที่ได้รับข้อมูลภายในองค์ประกอบ / คุณสมบัติเมื่อ XML ได้รับการประมวลผลในทางอนุกรม มันเร็วและง่ายขึ้นถ้าคุณวางแผนที่จะอ่านคุณสมบัติ / องค์ประกอบและ / หรือเขียนค่าบางอย่างกลับคืน (กรณีของคุณ)
  • DOMวิธีนี้สร้างแผนผังวัตถุซึ่งให้คุณแก้ไข / เข้าถึงแบบสุ่มดังนั้นจึงเป็นการดีกว่าสำหรับการจัดการและการจัดการ XML ที่ซับซ้อน
  • StAXนี่อยู่ตรงกลางของเส้นทางระหว่าง SAX และ DOM คุณเพียงแค่เขียนรหัสเพื่อดึงข้อมูลจาก parser ที่คุณสนใจเมื่อมีการประมวลผล

ลืมเกี่ยวกับ API ที่เป็นกรรมสิทธิ์เช่น JDOM หรือ Apache (เช่นApache Xerces XMLSerializer ) เพราะจะผูกคุณกับการใช้งานเฉพาะที่สามารถพัฒนาได้ในเวลาหรือสูญเสียความเข้ากันได้ย้อนหลังซึ่งจะทำให้คุณเปลี่ยนรหัสของคุณในอนาคตเมื่อคุณต้องการอัพเกรด JDOM เวอร์ชันใหม่หรือเครื่องมือแยกวิเคราะห์ที่คุณใช้ หากคุณใช้ API มาตรฐานของ Java (โดยใช้โรงงานและส่วนต่อประสาน) รหัสของคุณจะเป็นแบบแยกส่วนและบำรุงรักษาได้มากขึ้น

ไม่จำเป็นต้องพูดว่าทั้งหมด (ฉันไม่ได้ตรวจสอบทั้งหมด แต่ฉันเกือบจะแน่ใจ) ของตัวแยกวิเคราะห์ที่เสนอให้สอดคล้องกับการดำเนินการ JAXP ดังนั้นในทางเทคนิคคุณสามารถใช้ทั้งหมดได้ไม่ว่าจะใช้วิธีไหน


11
ที่จริงแล้ว 3 วิธี: StAX (javax.xml.stream) เป็นมาตรฐานที่สาม
StaxMan

1
java-samples.com/showtutorial.php?tutorialid=152 (ส่วนตัวชอบ SAX)
kitokid

@kitokid Chrome บอกฉันว่าหน้าเว็บมีสิ่งที่น่ารังเกียจอยู่ ฉันใช้สิ่งนี้แทน: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington

ภาพรวมที่ดี: สิ่งเดียวที่ฉันไม่เห็นด้วย - ในขณะที่การเพิ่ม / การสตรีม SAX และ Stax นั้นดี API มาตรฐานที่เพียงพอสำหรับ DOM นี่ไม่ใช่กรณี (IMO): มีเหตุผลที่ถูกต้องสำหรับ Java-specific เช่น XOM, JDOM และ DOM4J: DOM ผู้ไม่เชื่อเรื่องภาษานั้นค่อนข้างยุ่งยากในการใช้งาน
StaxMan

130

นี่คือการเปรียบเทียบที่ดีใน DOM, SAX, StAX & TrAX (ที่มา: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

คุณสมบัติ StAX SAX DOM TrAX

API Type                 pull, streaming, Push, streaming ในแผนผังหน่วยความจำ XSLT Rule

ความง่ายในการใช้งาน           สูงปานกลางสูงปานกลาง

XPath Capability    ไม่ไม่ใช่ใช่

CPU และหน่วยความจำ     Good Good แตกต่างกันไป

ส่งต่อเท่านั้น        ใช่ใช่ไม่ใช่ไม่ใช่

อ่าน XML              ใช่ใช่ใช่ใช่

เขียน XML              ใช่ไม่ใช่ใช่

รหัส CRUD                      ไม่ไม่ใช่ไม่ใช่


7
คุณสามารถเขียน XML ด้วย SAX sink จัดเตรียมการใช้งานตัวจัดการซึ่งผู้ใช้สามารถเรียกเหตุการณ์ SAX เพื่อสร้างเอาต์พุต XML (ฉันเห็นว่าตารางมีที่มาและไม่ใช่เนื้อหาต้นฉบับตารางผิดแม้ว่า)
Dev


4

นอกเหนือจาก SAX และ DOM แล้วยังมีการแยกวิเคราะห์ STaX โดยใช้ XMLStreamReader ซึ่งเป็นตัวแยกวิเคราะห์ xml


3

ฉันพบ dom4j เป็นเครื่องมือสำหรับการทำงานกับ XML โดยเฉพาะอย่างยิ่งเมื่อเทียบกับ Xerces


2

ฉันจะไม่แนะนำสิ่งนี้เพราะคุณมี "ความคิด" มากมายในแอปของคุณ แต่การใช้ XSLT อาจจะดีกว่า (และอาจเร็วกว่ากับการคอมไพล์ XSLT-to-bytecode) กว่าการจัดการ Java


3
ดีกว่าเป็นไปได้: เร็วกว่าและไม่น่าเป็นไปได้มาก
StaxMan

การอ่านการจัดการและการเขียน XML เป็นสิ่งที่ XSLT ออกแบบมาให้ทำ นี่เป็นคำตอบที่ดีทันที
james.garriss

1

ถ้าคุณใส่ใจเรื่องประสิทธิภาพน้อยฉันเป็นแฟนตัวยงของ Apache Digester เพราะมันช่วยให้คุณแมปโดยตรงจาก XML ไปยัง Java Beans

มิฉะนั้นคุณต้องแยกวิเคราะห์ก่อนแล้วจึงสร้างวัตถุของคุณ


ฉันไม่จำเป็นต้องสร้าง Java Beans เพียงแค่จัดการองค์ประกอบ XML แบบดิบๆและตรวจสอบองค์ประกอบบางอย่างเพื่อรับข้อมูลจากพวกเขาดังนั้นตัวแยกวิเคราะห์สไตล์ DOM น่าจะเป็นทางออกที่ดีที่สุดของฉัน
Evan

ใช่แล้ว dom4j น่าจะเป็นทางออกที่ดีกว่าที่นั่น ... ฉันเคยใช้มันอย่างหนักจนกระทั่งฉันขึ้นไปถึงระดับหนึ่งไปยังบ่อย่อย
Uri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.