Java için en iyi XML ayrıştırıcı [kapalı]


387

Ben ufacık (en az birkaç MB, UTF-8 kodlanmış) XML dosyalarını okumak, çeşitli öğeleri ve nitelikleri bakarak etrafında rummage, belki birkaç değiştirmek ve tekrar diske XML (tercihen güzel, girintili biçimlendirme ile) yazmak gerekir .

İhtiyaçlarım için en iyi XML ayrıştırıcısı ne olurdu? Aralarından seçim yapabileceğiniz çok şey var. Bazılarının farkındayım:

Ve elbette JDK'daki (Java 6 kullanıyorum). Xerces'e aşinayım ama bunu tıknaz bul.

Öneriler?


6
Bence, burada daha fazla oyuncu bulabilirsin: xml.com/lpt/a/1703
dma_k

1
bence bu soru ile ilgili gerçek sorunlar var. 1, şeylerden tamamen farklı olarak, ayrıştırıcıları (xerces, crimson) dom-manipülasyon kütüphaneleri (dom4j, xom, jdom) ile birlikte karşılaştırmaktır. ayrıca cevaplar savunuculuk eğilimindedir ve o kadar da yapıcı değildir.
Nathan Hughes

51
+220 ve yapıcı değil. Açıkça moderatörler ve kullanıcılar yapıcı olan hakkında farklı bakış açılarına sahiptir.
tbroberg

5
Evet, bu tür sorular söz konusu olduğunda mods dar görüşlü görünüyor. Evet, cevaplar tartışılabilir, ancak kesinlikle deneyime dayanır ve çoğu zaman cevaplar ölçülür. Modların, yapıcı eleştiri ve çıktılarla sonuçlanan tartışmaya açık olan bu soruları taşımak için muhtemelen farklı bir etiket oluşturması gerekir.
Eşref Ali Wahab

@dma_k bağlantınız çalışmıyor.
gaurav

Yanıtlar:


81

Hız ve bellek sorun değilse , dom4j gerçekten iyi bir seçenektir. Hıza ihtiyacınız varsa, Woodstox gibi bir StAX ayrıştırıcı kullanmak doğru yoldur, ancak işleri halletmek için daha fazla kod yazmanız ve akışlarda XML işlemeye alışmanız gerekir.


6
dom4j oldukça iyi, ama kesinlikle sorunsuz değil. İyi dom4j alternatifleri için bkz. Stackoverflow.com/questions/831865/…
Jonik

@zehrer iş parçacığı için güvenli mi?
gaurav

257

Belirli bir ayrıştırıcı uygulamasını dikkate almamanız gerektiğini düşünüyorum. XML İşleme için Java API'si, uygun tüm ayrıştırıcı uygulamalarını standart bir şekilde kullanmanızı sağlar. Kod çok daha taşınabilir olmalı ve belirli bir ayrıştırıcının çok eski olduğunu fark ettiğinizde, kodunuzun bir satırını değiştirmeden başka bir kodla değiştirebilirsiniz (doğru yaparsanız).

Temel olarak XML'yi standart bir şekilde ele almanın üç yolu vardır:

  • SAX Bu en basit API. XML, seri bir şekilde işlendiğinde, öğeler / nitelikler içindeki verileri alan bir İşleyici sınıfı tanımlayarak XML'yi okursunuz. Yalnızca bazı nitelikleri / öğeleri okumayı ve / veya bazı değerleri geri yazmayı (vakanız) planlamak daha hızlı ve kolaydır.
  • DOM Bu yöntem, karmaşık XML işleme ve işleme için daha iyi olması için rastgele değiştirmenize / erişmenize olanak tanıyan bir nesne ağacı oluşturur.
  • StAX SAX ve DOM arasındaki yolun ortasında. Sadece işlenirken ilgilendiğiniz ayrıştırıcıdan veri çekmek için kod yazmanız yeterlidir.

JDOM veya Apache gibi tescilli API'ları (yani Apache Xerces XMLSerializer ) unutun, çünkü sizi zaman içinde gelişebilecek veya geriye dönük uyumluluğu kaybedebilecek belirli bir uygulamaya bağlayacaksınız; JDOM'un yeni bir sürümünü veya hangi ayrıştırıcıyı kullanırsanız kullanın. Java standart API'sine (fabrikaları ve arayüzleri kullanarak) bağlı kalırsanız, kodunuz çok daha modüler ve bakımı yapılabilir olacaktır.

Önerilen ayrıştırıcıların hepsinin (hepsini kontrol etmedim, ama neredeyse eminim) bir JAXP uygulamasına uyduğunu söylemeye gerek yok, teknik olarak hepsini kullanabilirsiniz, hangisi olursa olsun.


11
Aslında 3 yol: StAX (javax.xml.stream) üçüncü standart yöntemdir.
StaxMan


@kitokid Chrome, sayfanın üzerinde kötü şeyler olduğunu söylüyor. Bunun yerine bunu kullandım: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington

İyi bir genel bakış: katılmamayacağım tek şey - artımlı / akış için, SAX ve Stax iyi, standart API yeterli, DOM için durum böyle değil (IMO): Java'ya özgü almanın geçerli nedenleri var XOM, JDOM ve DOM4J: dile agnostik DOM kullanımı oldukça zahmetlidir.
StaxMan

130

DOM, SAX, StAX ve TrAX üzerinde güzel bir karşılaştırma (Kaynak: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

Özellik StAX SAX DOM TrAX

API Tipi                 Çekme, akış Push, akış bellek ağacında XSLT Kuralı

Kullanım Kolaylığı           Yüksek Orta Yüksek Orta

XPath Yeteneği    Hayır Hayır Evet Evet

CPU ve Bellek     İyi İyi Değişir

Yalnızca İleri        Evet Evet Hayır Hayır

XML Oku              Evet Evet Evet Evet

XML Yaz              Evet Evet Evet Evet

CRUD                      Hayır Hayır Evet Hayır


7
SAX ile XML yazabilirsiniz. Lavabo, kullanıcının XML çıktısı oluşturmak için SAX olaylarını çağırabileceği bir işleyici uygulaması sağlar. (Tablonun orijinal malzeme değil, kaynaklı olduğunu görüyorum, tablo yanlış olsa da)
Dev


4

SAX ve DOM'a ek olarak, xml çekme ayrıştırıcısı olan XMLStreamReader'ı kullanarak STaX ayrıştırma kullanılabilir.


3

XML ile çalışmak için dom4j buldum. Özellikle Xerces ile karşılaştırıldığında.


2

Bunun uygulamanızda çok fazla "düşünme" yaptığınızı tavsiye etmem, ancak XSLT kullanmak Java manipülasyonundan daha iyi (ve XSLT-bytecode derlemesi ile potansiyel olarak daha hızlı olabilir).


3
Daha iyi, mümkün: daha hızlı, çok düşük.
StaxMan

XML okumak, değiştirmek ve yazmak tam olarak XSLT'nin yapmak için tasarlandığı şeydir. Bu güzel bir cevap.
james.garriss

1

Performansı daha az önemsiyorsanız, esasen XML'den Java Fasulyeleri'ne eşlemenize izin verdiği için Apache Digester'ın büyük bir hayranıyım.

Aksi takdirde, önce nesnelerinizi ayrıştırmanız ve sonra yapılandırmanız gerekir.


Java Beans yapmam gerekmiyor, sadece ham XML öğelerini biraz manipüle ediyorum ve onlardan veri almak için belirli öğeleri gözden geçiriyorum, bu yüzden DOM tarzı ayrıştırıcı muhtemelen benim ideal çözümüm.
Evan

Evet, dom4j muhtemelen orada daha iyi bir çözüm olurdu ... Sindirmeye kadar bir seviye çıkana kadar onu çok kullanıyordum
Uri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.