Parser XML terbaik untuk Java [ditutup]

387

Saya perlu membaca file XML bertubuh kecil (paling banyak MB, UTF-8), mencari-cari berbagai elemen dan atribut, mungkin memodifikasi beberapa dan menulis XML kembali lagi ke disk (lebih disukai dengan format bagus, indentasi) .

Apa yang akan menjadi parser XML terbaik untuk kebutuhan saya? Ada banyak pilihan. Beberapa yang saya sadari adalah:

Dan tentu saja yang ada di JDK (Saya menggunakan Java 6). Saya akrab dengan Xerces tetapi merasa kikuk.

Rekomendasi?

Evan
sumber
6
Saya pikir, Anda dapat menemukan lebih banyak pemain di sini: xml.com/lpt/a/1703
dma_k
1
Saya pikir ada masalah nyata dengan pertanyaan ini. Salah satunya adalah membandingkan sama sekali tidak seperti hal-hal, parser lumping (xerces, crimson) bersama-sama dengan perpustakaan dom-manipulasi (dom4j, xom, jdom). juga jawabannya cenderung ke arah advokasi dan tidak konstruktif.
Nathan Hughes
51
+220 dan tidak konstruktif. Jelas, moderator dan pengguna memiliki perspektif berbeda tentang apa yang konstruktif.
tbroberg
5
Ya, sepertinya para mod berpikiran pendek ketika datang ke pertanyaan seperti ini. Ya jawabannya akan dikemukakan tetapi pasti didasarkan pada pengalaman dan sebagian besar waktu jawabannya dihitung. Mod mungkin perlu membuat tag yang berbeda untuk memindahkan pertanyaan ini yang terbuka untuk diskusi yang menghasilkan kritik dan hasil yang konstruktif.
Ashraff Ali Wahab
@dma_k tautan Anda tidak berfungsi.
gaurav

Jawaban:

81

Jika kecepatan dan memori tidak ada masalah, dom4j adalah pilihan yang sangat bagus. Jika Anda membutuhkan kecepatan, menggunakan parser StAX seperti Woodstox adalah cara yang benar, tetapi Anda harus menulis lebih banyak kode untuk menyelesaikan sesuatu dan Anda harus terbiasa memproses XML dalam stream.

zehrer
sumber
6
dom4j cukup bagus, tapi jelas bukan tanpa masalah. Alternatif dom4j baik, lihat stackoverflow.com/questions/831865/...
Jonik
@zehrer apakah mereka aman?
gaurav
257

Saya pikir Anda tidak harus mempertimbangkan implementasi parser spesifik. API Java untuk Pemrosesan XML memungkinkan Anda menggunakan implementasi pengurai yang sesuai dengan cara standar. Kode harus jauh lebih portabel, dan ketika Anda menyadari bahwa parser tertentu sudah terlalu tua, Anda dapat menggantinya dengan yang lain tanpa mengubah baris kode Anda (jika Anda melakukannya dengan benar).

Pada dasarnya ada tiga cara penanganan XML dengan cara standar:

  • SAX Ini adalah API paling sederhana. Anda membaca XML dengan mendefinisikan kelas Handler yang menerima data di dalam elemen / atribut ketika XML diproses secara serial. Lebih cepat dan sederhana jika Anda hanya berencana untuk membaca beberapa atribut / elemen dan / atau menulis beberapa nilai kembali (kasus Anda).
  • DOM Metode ini membuat pohon objek yang memungkinkan Anda memodifikasi / mengaksesnya secara acak sehingga lebih baik untuk manipulasi dan penanganan XML yang kompleks.
  • StAX Ini berada di tengah jalan antara SAX dan DOM. Anda cukup menulis kode untuk menarik data dari parser yang Anda minati ketika diproses.

Lupakan API eksklusif seperti JDOM atau Apache (mis. Apache Xerces XMLSerializer ) karena akan mengikat Anda dengan implementasi spesifik yang dapat berkembang dalam waktu atau kehilangan kompatibilitas, yang akan membuat Anda mengubah kode Anda di masa mendatang ketika Anda ingin meningkatkan ke versi baru JDOM atau parser apa pun yang Anda gunakan. Jika Anda tetap menggunakan API standar Java (menggunakan pabrik dan antarmuka) kode Anda akan jauh lebih modular dan dapat dipelihara.

Tidak perlu untuk mengatakan bahwa semua (saya belum memeriksa semua, tapi saya hampir yakin) dari parser yang diusulkan mematuhi implementasi JAXP sehingga secara teknis Anda dapat menggunakan semua, tidak peduli yang mana.

Fernando Miguélez
sumber
11
Sebenarnya, 3 cara: StAX (javax.xml.stream) adalah standar ketiga.
StaxMan
@kitokid Chrome memberi tahu saya bahwa laman itu berisi hal-hal buruk. Saya menggunakan ini sebagai gantinya: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington
Gambaran umum yang bagus: hanya satu hal yang tidak akan saya setujui - sementara untuk penambahan / streaming, SAX dan Stax baik, API standar memadai, untuk DOM ini tidak terjadi (IMO): ada alasan yang sah untuk Java-specific dibutuhkan seperti XOM, JDOM dan DOM4J: DOM bahasa-agnostik cukup rumit untuk digunakan.
StaxMan
130

Berikut ini adalah perbandingan yang bagus pada DOM, SAX, StAX & TrAX (Sumber: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

Fitur StAX SAX DOM TrAX

Jenis API                 Tarik, streaming Push, streaming Di pohon memori Aturan XSLT

Kemudahan Penggunaan           Tinggi Sedang Tinggi Sedang

Kemampuan XPath    Tidak Tidak Ya Ya

CPU & Memori     Bagus Bagus Bervariasi Bervariasi

Hanya Maju        Ya Ya Tidak Tidak

Baca XML              Ya Ya Ya Ya

Tulis XML              Ya Tidak Ya Ya

CRUD                      Tidak Tidak Ya Tidak

Kadir
sumber
7
Anda dapat menulis XML dengan SAX. Wastafel menyediakan implementasi handler di mana pengguna dapat memanggil SAX events untuk menghasilkan output XML. (Saya melihat bahwa meja tersebut bersumber dan bukan bahan asli, tabelnya salah)
Dev
4

Selain SAX dan DOM ada parsing STaX tersedia menggunakan XMLStreamReader yang merupakan parser tarik xml.


sumber
3

Saya telah menemukan dom4j sebagai alat untuk bekerja dengan XML. Terutama dibandingkan dengan Xerces.

Brian Matthews
sumber
2

Saya tidak akan merekomendasikan hal ini karena Anda punya banyak "pemikiran" di aplikasi Anda, tetapi menggunakan XSLT bisa lebih baik (dan berpotensi lebih cepat dengan kompilasi XSLT-to-bytecode) daripada manipulasi Java.


sumber
3
Lebih baik, mungkin: lebih cepat, sangat tidak mungkin.
StaxMan
Membaca, memanipulasi, dan menulis XML adalah apa yang XSLT dirancang untuk dilakukan. Ini adalah jawaban yang bagus.
james.garriss
1

Jika Anda tidak terlalu peduli dengan kinerja, saya penggemar berat Apache Digester, karena ini pada dasarnya memungkinkan Anda memetakan langsung dari XML ke Java Beans.

Jika tidak, Anda harus mengurai dulu, dan kemudian membangun objek Anda.

Uri
sumber
Saya tidak perlu membuat Java Beans, hanya sedikit memanipulasi elemen XML mentah, dan meninjau elemen tertentu untuk mendapatkan data dari mereka, jadi pengurai gaya DOM mungkin solusi ideal saya.
Evan
Ya, dom4j mungkin akan menjadi solusi yang lebih baik di sana ... Dulu saya sering menggunakannya, sampai saya naik satu tingkat ke digester
Uri