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?

Premraj
źródło
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.

Voo
źródło
@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/

RAJH
źródło
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.

Michael Kay
źródło
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.

duffymo
źródło
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.

ChrisJ
źródło
3

Dla osób zainteresowanych korzystaniem z JDOM, ale obawiających się, że nie było aktualizowane od jakiegoś czasu (zwłaszcza nie wykorzystujących generycznych Java), istnieje fork o nazwie CoffeeDOM, który dokładnie rozwiązuje te aspekty i modernizuje JDOM API, przeczytaj więcej tutaj:

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

i pobierz go ze strony projektu pod adresem:

https://github.com/cdmckay/coffeedom

ngeek
źródło
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

vtd-xml-author
źródło
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