ซึ่งเป็นห้องสมุดที่ดีที่สุดสำหรับการแยกวิเคราะห์ XML ใน java [ปิด]


158

ฉันค้นหาห้องสมุด java สำหรับการแยกวิเคราะห์ XML (การกำหนดค่าที่ซับซ้อนและไฟล์ข้อมูล) ฉัน googled เล็กน้อย แต่ไม่พบ dom4j (ดูเหมือนว่าพวกเขากำลังทำงานบน V2) .. ฉันได้ดูที่การตั้งค่าทั่วไป แต่ไม่ได้ ไม่ชอบมันโครงการ Apache อื่น ๆ บน XML ดูเหมือนจะอยู่ภายใต้การจำศีล ฉันไม่ได้ประเมิน dom4j ด้วยตัวเอง แต่แค่อยากจะรู้ - จาวามีห้องสมุดโอเพ่นซอร์ส xml อื่น ๆ (ดี) หรือไม่? และประสบการณ์ของคุณกับ dom4j เป็นอย่างไร?

หลังจากคำตอบของ @ Voo ให้ฉันถามอีกอัน - ฉันควรใช้คลาสบิวด์อินของ java หรือไลบรารี่ของบุคคลที่สามอย่าง dom4j .. ข้อดีคืออะไร?


คุณนิยามได้ดีไหม ประสิทธิภาพคุณภาพของ API มีอะไรอย่างอื่นอีกหรือ
Yishai

ประสิทธิภาพและความสะดวกในการใช้งาน (ใช่คุณภาพของ API)
Premraj

3
คุณยังไม่ได้โพสต์เหตุผลเฉพาะเจาะจงใด ๆ ที่ไม่ได้ใช้งานเนทิฟของ Java
Hovercraft เต็มของปลาไหล

vtd-xml จะเป็นสิ่งที่เหนือกว่าสำหรับการใช้งานประสิทธิภาพ / หน่วยความจำและใช้งานง่าย
vtd-xml-author

คำตอบ:


213

จริงๆแล้ว Java รองรับ 4 วิธีในการแยกวิเคราะห์ XML ออกจากกล่อง:

DOM Parser / Builder: โครงสร้าง XML ทั้งหมดถูกโหลดเข้าสู่หน่วยความจำและคุณสามารถใช้วิธี DOM ที่รู้จักกันดีในการทำงานกับมัน DOM ยังช่วยให้คุณสามารถเขียนเอกสารด้วยการแปลง Xslt ตัวอย่าง:

public static void parse() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringElementContentWhitespace(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file = new File("test.xml");
    Document doc = builder.parse(file);
    // Do something with the document here.
}

SAX Parser: อ่านเอกสาร XML อย่างเดียว เครื่องมือแยกวิเคราะห์ Sax ทำงานผ่านเอกสารและเรียกวิธีการโทรกลับของผู้ใช้ มีวิธีการเริ่ม / สิ้นสุดของเอกสารองค์ประกอบและอื่น ๆ พวกเขากำลังกำหนดใน org.xml.sax.ContentHandler และมีคลาสตัวช่วยว่างเปล่า DefaultHandler

public static void parse() throws ParserConfigurationException, SAXException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser saxParser = factory.newSAXParser();
    File file = new File("test.xml");
    saxParser.parse(file, new ElementHandler());    // specify handler
}

StAx Reader / Writer: ใช้งานได้กับส่วนต่อประสานดาต้าสตรีม โปรแกรมจะถามองค์ประกอบถัดไปเมื่อพร้อมเช่นเคอร์เซอร์ / ตัววนซ้ำ คุณยังสามารถสร้างเอกสารด้วย อ่านเอกสาร:

public static void parse() throws XMLStreamException, IOException {
    try (FileInputStream fis = new FileInputStream("test.xml")) {
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
}

เขียนเอกสาร:

public static void parse() throws XMLStreamException, IOException {
    try (FileOutputStream fos = new FileOutputStream("test.xml")){
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
    }
}

JAXB: การนำไปใช้งานล่าสุดเพื่ออ่านเอกสาร XML: เป็นส่วนหนึ่งของ Java 6 ใน v2 สิ่งนี้ทำให้เราสามารถทำให้วัตถุ java เป็นอนุกรมจากเอกสาร คุณอ่านเอกสารที่มีคลาสที่ใช้อินเตอร์เฟสกับ javax.xml.bind.Unmarshaller (คุณจะได้รับคลาสสำหรับสิ่งนี้จาก JAXBContext.newInstance) บริบทจะต้องเริ่มต้นด้วยคลาสที่ใช้ แต่คุณต้องระบุคลาสรูทและไม่ต้องกังวลเกี่ยวกับคลาสอ้างอิงแบบคงที่ คุณใช้คำอธิบายประกอบเพื่อระบุว่าคลาสใดควรเป็นองค์ประกอบ (@XmlRootElement) และฟิลด์ใดเป็นองค์ประกอบ (@XmlElement) หรือแอตทริบิวต์ (@XmlAttribute น่าประหลาดใจมาก!)

public static void parse() throws JAXBException, IOException {
    try (FileInputStream adrFile = new FileInputStream("test")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
    }
}

เขียนเอกสาร:

public static void parse(RootElementClass out) throws IOException, JAXBException {
    try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(out, adrFile);
    }
}

ตัวอย่างที่คัดลอกมาจากสไลด์เลคเชอร์เก่า ๆ ;-)

แก้ไข: เกี่ยวกับ "ฉันควรใช้ API แบบใด" มันขึ้นอยู่กับว่าไม่ใช่ API ทุกตัวที่มีความสามารถเหมือนที่คุณเห็น แต่ถ้าคุณสามารถควบคุมคลาสที่คุณใช้ในการแมปเอกสาร XML JAXB นั้นเป็นที่ชื่นชอบส่วนตัวโซลูชันที่เรียบง่ายและสง่างามจริงๆ (แม้ว่าฉันไม่ได้ใช้ เอกสารที่มีขนาดใหญ่มากมันอาจซับซ้อนเล็กน้อย) SAX นั้นค่อนข้างใช้งานง่ายและอยู่ห่างจาก DOM ถ้าคุณไม่มีเหตุผลที่ดีที่จะใช้ API เก่า ๆ ที่เป็น clunky ในความคิดของฉัน ฉันไม่คิดว่าจะมีห้องสมุดบุคคลที่ 3 ที่ทันสมัยซึ่งมีประโยชน์อย่างยิ่งโดยเฉพาะที่ขาดหายไปจาก STL และห้องสมุดมาตรฐานมีข้อได้เปรียบตามปกติในการทดสอบเอกสารและมีเสถียรภาพ


@Natix นั่นเป็นสาเหตุที่ตัวเลือก "แก้ไข" มีไว้สำหรับ ควรจะดีกว่านี้
Kikiwa

4
@Kikiwa การจัดการข้อยกเว้นนั้นเกี่ยวกับการลบมากที่สุดเท่าที่จะเป็นไปได้ หากโปรแกรมเมอร์วางสำเนาไร้ความสามารถไปข้างหน้าและคัดลอกตัวอย่างโดยไม่เข้าใจวัตถุประสงค์ของพวกเขาพวกเขาได้รับสิ่งที่พวกเขาสมควรได้รับ ไม่กังวลหรือสนใจพวกเขาจริงๆ สิ่งที่ฉันจะพูดคือการลบบล็อค try / catch และแสดงลายเซ็นเมธอดแทนเอกสารสิ่งที่ตัวเลือกต่าง ๆ ที่สามารถโยนได้จะช่วยประหยัดพื้นที่ในขณะที่ยังคงรักษาข้อมูลที่น่าสนใจ ดังนั้นถ้ามีคนต้องการทำเช่นนั้นพวกเขาควรจะไปข้างหน้า
Voo

1
(ในเวลาเดียวกันฉันจะปฏิเสธการแก้ไขที่ลบการลอง / จับโดยไม่แสดงข้อมูลเพิ่มเติมในทางอื่น)
Voo

ฉันเชื่อว่า JAXB จะไม่รวมอยู่ใน JDK อีกต่อไปในรุ่นล่าสุด
Slaw

11

Java รองรับสองวิธีสำหรับการแยกวิเคราะห์ XML ออกจากกล่อง

SAXParser

คุณสามารถใช้ parser นี้หากคุณต้องการแยกไฟล์ XML ขนาดใหญ่และ / หรือไม่ต้องการใช้หน่วยความจำจำนวนมาก

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

ตัวอย่าง: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

คุณสามารถใช้ตัวแยกวิเคราะห์นี้ได้ถ้าคุณต้องการทำแบบสอบถาม XPath หรือต้องการให้ DOM สมบูรณ์พร้อมใช้งาน

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

ตัวอย่าง: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/


5

หากคุณต้องการ API เหมือน DOM นั่นคือที่ที่ตัวแยกวิเคราะห์ XML จะเปลี่ยนเอกสารให้เป็นโครงสร้างของโหนดองค์ประกอบและแอตทริบิวต์โหนด - มีอย่างน้อยสี่ตัวเลือก: DOM เอง, JDOM, DOM4J และ XOM เหตุผลที่เป็นไปได้เพียงอย่างเดียวในการใช้ DOM ก็คือเพราะมันถูกมองว่าเป็นมาตรฐานและมีให้ใน JDK: ในส่วนอื่น ๆ ทั้งหมดส่วนอื่น ๆ นั้นล้วนยอดเยี่ยมกว่า การตั้งค่าของฉันเองสำหรับการรวมกันของความเรียบง่ายพลังงานและประสิทธิภาพคือ XOM

และแน่นอนว่ายังมีรูปแบบอื่น ๆ ของการประมวลผล: อินเทอร์เฟซตัวแยกวิเคราะห์ระดับต่ำ (SAX และ StAX) อินเทอร์เฟซการผูกข้อมูลวัตถุ (JAXB) และภาษาประกาศระดับสูง (XSLT, XQuery, XPath) สิ่งที่ดีที่สุดสำหรับคุณขึ้นอยู่กับข้อกำหนดของโครงการและรสนิยมส่วนตัวของคุณ


2
DOM เป็นมาตรฐาน W3C ( w3.org/DOM ) การใช้งานจาวาของมาตรฐานนี้ครอบคลุมโดยมาตรฐาน JAXP ( jcp.org/en/jsr/detail?id=206 ) JAXP ถูกนำไปใช้งานโดยผู้ให้บริการที่แตกต่างกันเช่น: Oracle, Apache และอื่น ๆ
bdoughan

แน่นอนไม่มีใครที่จะใช้ DOM เลยถ้าไม่ใช่ (ก) มันถูกกำหนดให้เป็นมาตรฐานและมีการใช้งานหลายอย่างและ (b) มันถูกรวมอยู่ใน JDK โดยค่าเริ่มต้น จากมุมมองอื่น ๆ ทั้งหมด JDOM2 และ XOM เป็นที่นิยมมากกว่า
Michael Kay

4

ประเด็นของ Nikita นั้นยอดเยี่ยมมาก: อย่าสับสนกับการเป็นผู้ใหญ่ที่ไม่ดี XML ไม่เปลี่ยนแปลงมากนัก

JDOM จะเป็นอีกทางเลือกหนึ่งสำหรับ DOM4J


คุณจะเลือกอันไหนและทำไม
Premraj

1
มันไม่สำคัญอะไรมาก ทั้งสองเป็นตัวแยกส่วนของตัวแยกวิเคราะห์ SAX และ DOM ที่สร้างไว้ใน JDK ลำดับชั้นเอกสาร W3C นั้นละเอียดและใช้งานได้ยากดังนั้นทั้ง DOM4J และ JDOM จึงพยายามทำให้ง่ายขึ้น ฉันชอบ Elliott Rusty Harold ดังนั้นฉันจึงมักจะไปถึง JDOM ก่อน
duffymo

4

คุณไม่จำเป็นต้องมีห้องสมุดภายนอกสำหรับการแยกวิเคราะห์ XML ใน Java Java มาพร้อมกับการติดตั้งในตัวสำหรับ SAX และ DOM สำหรับทุกวัย


3

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

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

และดาวน์โหลดจากหน้าโครงการที่:

https://github.com/cdmckay/coffeedom


1

VTD-XML เป็นหน้าที่แยกวิเคราะห์ XML หนัก ... ดีกว่าอย่างอื่นในแทบทุกวิธี ... นี่คือกระดาษ 2013 ที่วิเคราะห์เฟรมเวิร์กการประมวลผล XML ทั้งหมดที่มีในแพลตฟอร์ม Java ...

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf


3
คำเตือน: VTD-XML เป็นลิขสิทธิ์ภายใต้ GPL ซึ่งกฎที่มีประสิทธิภาพออกมาในสถานการณ์การพัฒนามืออาชีพหรือเชิงพาณิชย์ส่วนใหญ่ วิศวกรควรปรึกษาทนายความของตนเองเพื่อทำการวิเคราะห์ แต่ถ้าคุณได้รับค่าตอบแทนในการทำวิศวกรรมคุณจะพบว่าองค์กรของคุณไม่ได้ (และไม่สามารถ) อนุญาตให้ใช้ห้องสมุดใด ๆ ที่ได้รับอนุญาตภายใต้ GPL
ซาร่าห์ G

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