Java'da XML ayrıştırma için en iyi kütüphane hangisi [kapalı]


158

XML (karmaşık yapılandırma ve veri dosyaları) ayrıştırma için java kitaplığı arıyorum, biraz googled ama dom4j (V2 üzerinde çalışıyor gibi görünüyor) dışında bulunamadı ... .. Commons yapılandırma bakmak aldım ama didn Beğenmedim, XML'deki diğer apache projeleri hazırda bekletme altında görünüyor. Dom4j'i kendim değerlendirmedim ama sadece bilmek istedim - Java'nın diğer (İyi) açık kaynak xml ayrıştırma kütüphaneleri var mı? ve dom4j ile olan deneyiminiz nasıl?

@ Voo'nun cevabından sonra bir tane daha sormama izin verin - Java'nın yerleşik sınıflarını veya dom4j gibi herhangi bir üçüncü taraf kütüphanesini kullanmalıyım .. Avantajları nelerdir?


İyi tanımlayabilir misiniz? Performans, API kalitesi, başka bir şey?
Yishai

Performans ve kullanım kolaylığı (evet, API Kalitesi)
Premraj

3
Java'nın yerel uygulamalarını kullanmamanız için belirli bir neden yayınlamadınız.
Hovercraft Eels Dolu

vtd-xml, performans / bellek kullanımı ve kullanım kolaylığı için yenilecek olan olacaktır.
vtd-xml-author

Yanıtlar:


213

Aslında Java, XML'i kutudan ayırmak için 4 yöntemi destekler:

DOM Ayrıştırıcı / Oluşturucu: Tüm XML yapısı belleğe yüklenir ve onunla çalışmak için iyi bilinen DOM yöntemlerini kullanabilirsiniz. DOM ayrıca Xslt dönüşümleriyle belgeye yazmanıza da olanak tanır. Misal:

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 Ayrıştırıcı: Yalnızca bir XML belgesi okumak için. Sax ayrıştırıcı belge üzerinden çalışır ve kullanıcının geri arama yöntemlerini çağırır. Bir belgenin, öğenin başlangıcı / bitişi için yöntemler vardır. Bunlar org.xml.sax.ContentHandler içinde tanımlanır ve boş bir DefaultHandler yardımcı sınıfı vardır.

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 Okuyucu / Yazıcı: Bu veri akışı odaklı bir arayüzle çalışır. Program, bir imleç / yineleyici gibi hazır olduğunda bir sonraki öğeyi ister. Bununla birlikte belgeler de oluşturabilirsiniz. Belgeyi okuyun:

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

Belge yaz:

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 belgelerini okumak için en yeni uygulama: v2'deki Java 6'nın bir parçasıdır. Bu, bir belgeden java nesnelerini serileştirmemize izin verir. Belgeyi javax.xml.bind.Unmarshaller için bir arabirim uygulayan bir sınıfla okursunuz (bunun için bir sınıf JAXBContext.newInstance adresinden alırsınız). Bağlamın kullanılan sınıflarla başlatılması gerekir, ancak yalnızca kök sınıflarını belirtmeniz gerekir ve statik başvurulan sınıflar hakkında endişelenmeniz gerekmez. Hangi sınıfların öğe (@XmlRootElement) olması ve hangi alanların öğe (@XmlElement) veya nitelikler (@XmlAttribute, ne sürpriz!) Olacağını belirtmek için ek açıklamalar kullanırsınız.

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

Belge yaz:

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

Bazı eski ders slaytlarından utanmadan kopyalanan örnekler ;-)

Düzenleme: Hakkında "hangi API'yi kullanmalıyım?". Şey bağlıdır - tüm API'ler gördüğünüz gibi aynı yeteneklere sahip değildir, ancak XML belgesini eşlemek için kullandığınız sınıflar üzerinde kontrolünüz varsa JAXB benim kişisel favori, gerçekten zarif ve basit bir çözümdür ( Gerçekten büyük belgeler, biraz karmaşık olabilir). SAX'ın kullanımı oldukça kolaydır ve kullanmak için gerçekten iyi bir nedeniniz yoksa DOM'dan uzak durun - bence eski, hantal API. STL'de eksik olan özellikle kullanışlı bir şey içeren herhangi bir modern üçüncü taraf kütüphanesi olduğunu düşünmüyorum ve standart kütüphaneler son derece iyi test edilmiş, belgelenmiş ve kararlı olmanın olağan avantajlarına sahip.


@Natix bu yüzden "düzenle" seçeneği içindir. Şimdi daha iyi olmalı.
Kikiwa

4
@Kikiwa İstisna işleme, bu gönderinin noktasından mümkün olduğunca kaldırılmıştır. Bazı beceriksiz kopyala-yapıştır programcısı devam edip parçacıkları amaçlarını anlamadan kopyalarsa hak ettiklerini alırlar. Onlarla gerçekten ilgili endişe duymuyorum. Söyleyeceğim, try / catch bloklarını kaldırmak ve farklı seçeneklerin hangi istisnaları atabileceğini belgelemek için yöntem imzasını göstermek, yine de ilginç bilgileri korurken yerden tasarruf sağlayacaktır. Birisi bunu yapmak istiyorsa, devam etmeliler.
Voo

1
(Aynı zamanda, ek bilgileri başka bir şekilde belirtmeden try / catch'i kaldıran düzenlemeleri reddedeceğim)
Voo

JAXB'in son sürümlerde artık JDK ile birlikte bulunmadığına inanıyorum.
Slaw

11

Java, kutunun dışında XML ayrıştırma için iki yöntemi destekler.

SAXParser

Büyük XML dosyalarını ayrıştırmak ve / veya çok fazla bellek kullanmak istemiyorsanız bu ayrıştırıcıyı kullanabilirsiniz.

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

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

DOMParser

Bu ayrıştırıcıyı XPath sorguları yapmanız veya DOM'un tamamının kullanılabilir olması gerekiyorsa kullanabilirsiniz.

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

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


5

DOM benzeri bir API (yani, XML ayrıştırıcısının belgeyi Element ve Attribute düğümleri ağacına dönüştürdüğü) istiyorsanız, DOM'un kendisi, JDOM, DOM4J ve XOM arasından seçim yapabileceğiniz en az dört tane vardır. DOM'u kullanmanın olası tek nedeni, standart olarak algılanması ve JDK'da sunulmasıdır: diğer tüm açılardan, diğerleri daha üstündür. Sadelik, güç ve performans kombinasyonu nedeniyle kendi tercihim XOM.

Ve elbette, başka işleme stilleri de vardır: düşük düzeyli ayrıştırıcı arabirimleri (SAX ve StAX), veri nesnesi bağlama arabirimleri (JAXB) ve yüksek düzeyli bildirici diller (XSLT, XQuery, XPath). Sizin için en iyisi proje gereksinimlerinize ve kişisel zevkinize bağlıdır.


2
DOM bir W3C standardıdır ( w3.org/DOM ). Bu standardın Java uygulaması JAXP standardı ( jcp.org/en/jsr/detail?id=206 ) kapsamındadır. JAXP daha sonra Oracle, Apache,
vb.Gibi

Aslında, hiç kimse DOM'u (a) standart olarak tanımlanmış ve birden fazla uygulamaya sahip olmasaydı ve (b) varsayılan olarak JDK'ya dahil edilmemiş olsaydı DOM'u kullanamazdı. Diğer tüm açılardan JDOM2 ve XOM çok tercih edilir.
Michael Kay

4

Nikita'nın amacı mükemmel bir şey: olgun ile kötüyü karıştırmayın. XML çok fazla değişmedi.

JDOM, DOM4J'ye başka bir alternatif olacaktır.


Hangisini seçeceksin ve neden?
Premraj

1
Gerçekten çok önemli değil. Her ikisi de JDK'da yerleşik SAX ve DOM ayrıştırıcılarının sarmalayıcılarıdır. W3C Belge hiyerarşisi ayrıntılı ve kullanımı zordur, bu nedenle hem DOM4J hem de JDOM bunu kolaylaştırmaya çalışır. Elliott Rusty Harold'ı seviyorum, bu yüzden önce JDOM'a ulaşma eğilimindeyim.
duffymo

4

Java'da XML'yi ayrıştırmak için harici bir kütüphaneye ihtiyacınız yoktur. Java, çağlar boyunca SAX ve DOM için yerleşik uygulamalarla birlikte geldi.



1

VTD-XML ağır XML ayrıştırma lib ... hemen hemen her şekilde diğerlerinden daha iyidir ... burada java platformunda mevcut tüm XML işleme çerçevelerini analiz eden bir 2013 makalesi ...

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


3
Bir uyarı: VTD-XML, profesyonel veya ticari gelişim durumlarının büyük çoğunluğunda etkili bir şekilde ortadan kaldıran GPL altında lisanslanmıştır. Mühendisler bir analiz için kendi avukatlarına danışmalıdır, ancak mühendislik yapmak için ödeme alırsanız, büyük olasılıkla kuruluşunuzun GPL kapsamında lisanslanan herhangi bir kütüphanenin kullanımına izin vermediğini (ve izin veremeyeceğini) göreceksiniz.
Sarah G

Bu bağlantı öldü
null
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.