Jaka jest najlepsza biblioteka do analizowania XML w java [zamknięte]


158

Przeszukuję bibliotekę java pod kątem parsowania XML (złożona konfiguracja i pliki danych), trochę googlowałem, ale nie znalazłem innego niż dom4j (wygląda na to, że pracują na V2). Przyjrzałem się konfiguracji wspólnej, ale nie Nie podoba mi się, inne projekty Apache w XML wydają się być w stanie hibernacji. Nie oceniałem samodzielnie domeny dom4j, ale chciałem tylko wiedzieć - Czy Java ma inne (dobre) biblioteki parsujące XML typu open source? a jakie masz doświadczenia z dom4j?

Po odpowiedzi @ Voo pozwól mi zapytać jeszcze jedno - czy powinienem używać wbudowanych klas Java, czy dowolnej biblioteki innej firmy, takiej jak dom4j .. Jakie są zalety?


Czy potrafisz dobrze zdefiniować? Wydajność, jakość API, coś jeszcze?
Yishai

Wydajność i łatwość użycia (tak, jakość API)
Premraj

3
Nie opublikowałeś żadnych konkretnych powodów, dla których nie używasz natywnych implementacji Javy.
Poduszkowiec pełen węgorzy

vtd-xml będzie tym, który pobije pod względem wydajności / wykorzystania pamięci i łatwości użycia.
vtd-xml-author

Odpowiedzi:


213

W rzeczywistości Java obsługuje 4 metody analizowania XML po wyjęciu z pudełka:

Parser / Builder DOM: Cała struktura XML jest ładowana do pamięci i możesz używać dobrze znanych metod DOM do pracy z nią. DOM umożliwia również pisanie w dokumencie z przekształceniami Xslt. Przykład:

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: wyłącznie do odczytu dokumentu XML. Parser Saxa przegląda dokument i wywołuje metody wywołania zwrotnego użytkownika. Istnieją metody na początek / koniec dokumentu, elementu i tak dalej. Są zdefiniowane w org.xml.sax.ContentHandler i istnieje pusta klasa pomocnicza 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: Działa z interfejsem zorientowanym na strumień danych. Program prosi o następny element, gdy jest gotowy, tak jak kursor / iterator. Możesz także tworzyć za jego pomocą dokumenty. Przeczytaj dokument:

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

Napisz dokument:

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: Najnowsza implementacja do odczytu dokumentów XML: Jest częścią Java 6 w wersji 2. To pozwala nam serializować obiekty Java z dokumentu. Czytasz dokument z klasą, która implementuje interfejs do javax.xml.bind.Unmarshaller (klasę do tego dostajesz z JAXBContext.newInstance). Kontekst musi zostać zainicjowany przy użyciu używanych klas, ale wystarczy określić klasy główne i nie trzeba martwić się o klasy statyczne, do których istnieją odwołania. Używasz adnotacji, aby określić, które klasy powinny być elementami (@XmlRootElement), a które pola są elementami (@XmlElement) lub atrybutami (@XmlAttribute, co za niespodzianka!)

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

Napisz dokument:

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

Przykłady bezwstydnie skopiowane ze starych slajdów z wykładów ;-)

Edycja: informacje o tym, „którego interfejsu API mam użyć?”. Cóż, to zależy - nie wszystkie API mają takie same możliwości, jak widzisz, ale jeśli masz kontrolę nad klasami używanymi do mapowania dokumentu XML, JAXB jest moim ulubionym, naprawdę eleganckim i prostym rozwiązaniem (chociaż nie używałem go do naprawdę duże dokumenty, może się trochę skomplikować). SAX jest również dość łatwy w użyciu i po prostu trzymaj się z dala od DOM, jeśli nie masz naprawdę dobrego powodu, aby go używać - moim zdaniem stary, niezgrabny interfejs API. Nie sądzę, aby istniały żadne nowoczesne biblioteki innych firm, które zawierają coś szczególnie przydatnego, czego brakuje w STL, a standardowe biblioteki mają zwykłe zalety, ponieważ są wyjątkowo dobrze przetestowane, udokumentowane i stabilne.


@Natix, dlatego opcja "edytuj" jest przeznaczona. Teraz powinno być lepiej.
Kikiwa

4
Obsługa wyjątków @Kikiwa jest jak najbardziej oddalona od tego postu. Jeśli jakiś niekompetentny programista kopiujący i wklejający idzie dalej i kopiuje fragmenty bez zrozumienia ich celu, dostaje to, na co zasługuje. Nie bardzo się nimi martwiłem ani nie interesowałem. Powiem, że usunięcie bloków try / catch i pokazanie zamiast tego sygnatury metody w celu udokumentowania wyjątków, które mogą generować różne opcje, pozwoliłoby zaoszczędzić miejsce, jednocześnie zachowując interesujące informacje. Więc jeśli ktoś chce to zrobić, powinien po prostu iść dalej.
Voo

1
(Jednocześnie odrzucę zmiany, które usuwają try / catch bez oznaczania dodatkowych informacji w inny sposób)
Voo

Uważam, że JAXB nie jest już dołączony do JDK w ostatnich wersjach.
Slaw

11

Java obsługuje dwie metody analizowania XML po wyjęciu z pudełka.

SAXParser

Możesz użyć tego parsera, jeśli chcesz analizować duże pliki XML i / lub nie chcesz zużywać dużo pamięci.

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

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

DOMParser

Możesz użyć tego parsera, jeśli potrzebujesz wykonywać zapytania XPath lub musisz mieć dostępny cały DOM.

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

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


5

Jeśli potrzebujesz API podobnego do DOM - to znaczy takiego, w którym parser XML przekształca dokument w drzewo węzłów elementów i atrybutów - masz co najmniej cztery do wyboru: sam DOM, JDOM, DOM4J i XOM. Jedynym możliwym powodem używania DOM jest to, że jest on postrzegany jako standard i jest dostarczany w JDK: pod wszystkimi innymi względami wszystkie inne są lepsze. Moje własne preferencje, ze względu na połączenie prostoty, mocy i wydajności, to XOM.

Oczywiście są też inne style przetwarzania: niskopoziomowe interfejsy parsera (SAX i StAX), interfejsy wiązania obiektów danych (JAXB) i języki deklaratywne wysokiego poziomu (XSLT, XQuery, XPath). To, co jest dla Ciebie najlepsze, zależy od wymagań projektu i osobistego gustu.


2
DOM to standard W3C ( w3.org/DOM ). Implementacja tego standardu w języku Java jest objęta standardem JAXP ( jcp.org/en/jsr/detail?id=206 ). JAXP jest następnie wdrażany przez różnych dostawców, takich jak: Oracle, Apache itp.
bdoughan

Rzeczywiście, nikt w ogóle nie używałby DOM, gdyby nie to, że (a) został zdefiniowany jako standard i ma wiele implementacji, oraz (b) jest domyślnie zawarty w JDK. Ze wszystkich innych perspektyw JDOM2 i XOM są znacznie lepsze.
Michael Kay

4

Argument Nikity jest doskonały: nie myl dojrzałości ze złem. XML niewiele się zmienił.

JDOM byłby kolejną alternatywą dla DOM4J.


Który wybierzesz i dlaczego?
Premraj,

1
Nie ma to większego znaczenia. Oba są opakowaniami parserów SAX i DOM wbudowanymi w JDK. Hierarchia dokumentów W3C jest rozwlekła i trudna w użyciu, więc zarówno DOM4J, jak i JDOM starają się to ułatwić. Lubię Elliotta Rusty'ego Harolda, więc najpierw sięgam po JDOM.
duffymo

4

Nie potrzebujesz zewnętrznej biblioteki do analizowania XML w Javie. Java od wieków zawiera wbudowane implementacje SAX i DOM.



1

VTD-XML to wysokowydajna biblioteka analizująca XML ... jest lepsza od innych praktycznie pod każdym względem ... oto artykuł z 2013 roku, który analizuje wszystkie struktury przetwarzania XML dostępne na platformie java ...

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


3
Ostrzeżenie: VTD-XML jest licencjonowany na licencji GPL, co skutecznie wyklucza go w większości sytuacji związanych z rozwojem zawodowym lub komercyjnym. Inżynierowie powinni skonsultować się ze swoim prawnikiem w celu przeprowadzenia analizy, ale jeśli otrzymujesz wynagrodzenie za prace inżynierskie, najprawdopodobniej okaże się, że Twoja organizacja nie zezwala (i nie może) na korzystanie z żadnych bibliotek licencjonowanych na licencji GPL.
Sarah G

Ten link jest nieaktywny
zerowy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.