Yang merupakan perpustakaan terbaik untuk parsing XML di java [ditutup]

158

Saya sedang mencari perpustakaan java untuk parsing XML (konfigurasi kompleks dan file data), saya googled sedikit tetapi tidak dapat menemukan selain dom4j (Sepertinya mereka bekerja pada V2) .. Saya telah melihat konfigurasi commons tetapi tidak Seperti itu, proyek apache lain pada XML tampaknya dalam mode hibernasi. Saya belum mengevaluasi dom4j sendiri tetapi hanya ingin tahu - Apakah java memiliki perpustakaan parsing xml open source lain dan bagaimana pengalaman Anda dengan dom4j?

Setelah jawaban @ Voo, izinkan saya bertanya yang lain - Haruskah saya menggunakan kelas built-in java atau perpustakaan pihak ketiga seperti dom4j .. Apa keuntungannya?

Premraj
sumber
Bisakah Anda mendefinisikan yang baik? Kinerja, kualitas API, sesuatu yang lain?
Yishai
Performa dan kemudahan penggunaan (ya, Kualitas API)
Premraj
3
Anda belum mengeposkan alasan khusus untuk tidak menggunakan implementasi asli Java.
Hovercraft Full Of Belut
vtd-xml akan menjadi yang dikalahkan untuk penggunaan kinerja / memori dan kemudahan penggunaan.
vtd-xml-author

Jawaban:

213

Sebenarnya Java mendukung 4 metode untuk mem-parsing XML di luar kotak:

DOM Parser / Builder: Seluruh struktur XML dimuat ke dalam memori dan Anda dapat menggunakan metode DOM yang terkenal untuk bekerja dengannya. DOM juga memungkinkan Anda untuk menulis ke dokumen dengan transformasi Xslt. Contoh:

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.
}

Parser SAX: Semata-mata untuk membaca dokumen XML. Pengurai Sax dijalankan melalui dokumen dan memanggil metode panggilan balik pengguna. Ada metode untuk memulai / mengakhiri dokumen, elemen dan sebagainya. Mereka didefinisikan dalam org.xml.sax.ContentHandler dan ada kelas helper DefaultHandler kosong.

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: Ini bekerja dengan antarmuka berorientasi data. Program meminta elemen berikutnya ketika siap seperti kursor / iterator. Anda juga dapat membuat dokumen dengannya. Baca dokumen:

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
        }
    }
}

Menulis dokumen:

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: Implementasi terbaru untuk membaca dokumen XML: Merupakan bagian dari Java 6 di v2. Ini memungkinkan kita untuk membuat serial objek java dari dokumen. Anda membaca dokumen dengan kelas yang mengimplementasikan antarmuka ke javax.xml.bind.Unmarshaller (Anda mendapatkan kelas untuk ini dari JAXBContext.newInstance). Konteksnya harus diinisialisasi dengan kelas yang digunakan, tetapi Anda hanya perlu menentukan kelas root dan tidak perlu khawatir tentang kelas referensi statis. Anda menggunakan anotasi untuk menentukan kelas mana yang harus elemen (@XmlRootElement) dan bidang mana yang elemen (@XmlElement) atau atribut (@XmlAttribute, sungguh kejutan!)

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);
    }
}

Menulis dokumen:

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);
    }
}

Contoh disalin tanpa malu-malu dari beberapa slide kuliah lama ;-)

Sunting: Tentang "API mana yang harus saya gunakan?". Yah itu tergantung - tidak semua API memiliki kemampuan yang sama seperti yang Anda lihat, tetapi jika Anda memiliki kendali atas kelas yang Anda gunakan untuk memetakan dokumen XML JAXB adalah solusi favorit saya, benar-benar elegan dan sederhana (meskipun saya belum menggunakannya untuk dokumen yang sangat besar, bisa jadi agak rumit). SAX juga cukup mudah digunakan dan menjauhlah dari DOM jika Anda tidak memiliki alasan yang bagus untuk menggunakannya - API yang kikuk menurut saya. Saya tidak berpikir ada perpustakaan pihak ke-3 modern yang menampilkan sesuatu yang sangat berguna yang hilang dari STL dan perpustakaan standar memiliki keuntungan yang biasa diuji dengan sangat baik, didokumentasikan dan stabil.

Voo
sumber
@ Natix itu sebabnya opsi "edit" adalah untuk. Seharusnya lebih baik sekarang.
Kikiwa
4
@Kikiwa Penanganan pengecualian sekitar sebanyak mungkin dihapus dari titik posting ini mungkin. Jika beberapa programmer copy-paste tidak kompeten maju dan menyalin snippet tanpa memahami tujuan mereka, mereka mendapatkan apa yang pantas mereka dapatkan. Tidak terlalu khawatir atau tertarik dengan mereka. Apa yang akan saya katakan adalah bahwa menghapus blok coba / tangkap dan menunjukkan tanda tangan metode sebagai gantinya untuk mendokumentasikan pengecualian apa yang dapat dilemparkan oleh opsi yang berbeda akan menghemat ruang sambil tetap menyimpan informasi yang menarik. Jadi jika seseorang ingin melakukan itu, mereka harus melanjutkan.
Voo
1
(Pada saat yang sama saya akan menolak suntingan yang menghapus coba / tangkapan tanpa menunjukkan informasi tambahan dengan cara lain)
Voo
Saya percaya JAXB tidak lagi disertakan dengan JDK dalam versi terbaru.
Slaw
11

Java mendukung dua metode untuk parsing XML di luar kotak.

SAXParser

Anda dapat menggunakan parser ini jika Anda ingin mem-parsing file XML besar dan / atau tidak ingin menggunakan banyak memori.

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

Contoh: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

Anda dapat menggunakan parser ini jika Anda perlu melakukan pertanyaan XPath atau perlu memiliki DOM lengkap.

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

Contoh: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

RAJH
sumber
5

Jika Anda menginginkan API seperti DOM - yaitu, tempat parser XML mengubah dokumen menjadi pohon Elemen dan Atribut node - maka setidaknya ada empat untuk dipilih: DOM sendiri, JDOM, DOM4J, dan XOM. Satu-satunya alasan yang mungkin untuk menggunakan DOM adalah karena itu dianggap sebagai standar dan disediakan di JDK: dalam semua hal lain, yang lain semuanya lebih unggul. Preferensi saya sendiri, untuk kombinasi kesederhanaan, kekuatan, dan kinerja, adalah XOM.

Dan tentu saja, ada gaya pemrosesan lainnya: antarmuka parser tingkat rendah (SAX dan StAX), antarmuka pengikat objek-data (JAXB), dan bahasa deklaratif tingkat tinggi (XSLT, XQuery, XPath). Yang terbaik untuk Anda tergantung pada persyaratan proyek dan selera pribadi Anda.

Michael Kay
sumber
2
DOM adalah standar W3C ( w3.org/DOM ). Implementasi Java untuk standar ini dicakup oleh standar JAXP ( jcp.org/en/jsr/detail?id=206 ). JAXP kemudian diimplementasikan oleh penyedia yang berbeda seperti: Oracle, Apache, dll.
bdoughan
Memang, tidak ada yang akan menggunakan DOM sama sekali jika bukan itu (a) itu didefinisikan sebagai standar dan memiliki beberapa implementasi, dan (b) itu termasuk dalam JDK secara default. Dari semua perspektif lain, JDOM2 dan XOM jauh lebih disukai.
Michael Kay
4

Poin Nikita sangat bagus: jangan bingung menjadi dewasa dengan yang buruk. XML tidak banyak berubah.

JDOM akan menjadi alternatif lain untuk DOM4J.

Duffymo
sumber
Yang mana yang akan Anda pilih dan mengapa?
Premraj
1
Tidak terlalu penting. Keduanya adalah pembungkus parser SAX dan DOM yang dibangun ke dalam JDK. Hirarki Dokumen W3C adalah verbose dan sulit digunakan, sehingga DOM4J dan JDOM berusaha membuatnya lebih mudah. Saya suka Elliott Rusty Harold, jadi saya cenderung meraih JDOM dulu.
duffymo
4

Anda tidak perlu perpustakaan eksternal untuk parsing XML di Java. Java telah hadir dengan implementasi bawaan untuk SAX dan DOM sejak lama.

ChrisJ
sumber
1

VTD-XML adalah tugas berat XML parsing lib ... lebih baik daripada yang lain dalam segala hal ... di sini adalah makalah 2013 yang menganalisis semua kerangka kerja XML yang tersedia di platform java ...

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

vtd-xml-author
sumber
3
Peringatan: VTD-XML dilisensikan di bawah GPL, yang secara efektif mengesampingkannya dalam sebagian besar situasi pengembangan profesional atau komersial. Insinyur harus berkonsultasi dengan pengacara mereka sendiri untuk analisis, tetapi jika Anda dibayar untuk melakukan rekayasa maka Anda kemungkinan besar akan menemukan bahwa organisasi Anda tidak (dan tidak bisa) mengizinkan penggunaan perpustakaan apa pun yang dilisensikan di bawah GPL.
Sarah G
Tautan itu sudah mati
null