Najlepszy parser XML dla Java [zamknięty]

387

Muszę czytać małe pliki XML (co najwyżej kilka MB, zakodowane w UTF-8), szperać w poszukiwaniu różnych elementów i atrybutów, być może zmodyfikować kilka i ponownie zapisać XML na dysku (najlepiej z ładnym, wciętym formatowaniem) .

Jaki byłby najlepszy parser XML dla moich potrzeb? Jest wiele do wyboru. Niektóre są mi znane:

I oczywiście ten w JDK (używam Java 6). Znam Xerces, ale uważam, że jest niezgrabny.

Rekomendacje?

Evan
źródło
6
Myślę, że można znaleźć więcej graczy tutaj: xml.com/lpt/a/1703
dma_k
1
myślę, że z tym pytaniem są prawdziwe problemy. 1 jest to, że porównuje się zupełnie inaczej, łącząc parsery (xerces, szkarłat) z bibliotekami do manipulacji dom (dom4j, xom, jdom). również odpowiedzi mają tendencję do popierania i nie są tak konstruktywne.
Nathan Hughes
51
+220 i nie jest konstruktywny. Oczywiście moderatorzy i użytkownicy mają różne perspektywy na to, co jest konstruktywne.
tbroberg,
5
Tak, wydaje się, że mody są krótkowzroczne, jeśli chodzi o takie pytania. Tak, odpowiedzi byłyby opiniotwórcze, ale zdecydowanie oparte na doświadczeniu i przez większość czasu odpowiedzi są kwantyfikowane. Mody muszą stworzyć prawdopodobnie inny tag, aby przenieść te pytania, które są otwarte do dyskusji, co prowadzi do konstruktywnej krytyki i wyników.
Ashraff Ali Wahab
@dma_k Twój link nie działa.
gaurav,

Odpowiedzi:

81

Jeśli prędkość i pamięć nie stanowią problemu, dom4j jest naprawdę dobrą opcją. Jeśli potrzebujesz szybkości, użycie parsera StAX, takiego jak Woodstox, jest właściwym sposobem, ale musisz napisać więcej kodu, aby załatwić sprawę i musisz przyzwyczaić się do przetwarzania XML w strumieniach.

zehrer
źródło
6
dom4j jest całkiem niezły, ale na pewno nie bez problemów. Aby znaleźć dobre alternatywy dla dom4j, zobacz stackoverflow.com/questions/831865/…
Jonik
@zehrer czy są bezpieczne dla wątków?
gaurav,
257

Myślę, że nie powinieneś brać pod uwagę żadnej konkretnej implementacji parsera. Java API for XML Processing pozwala na użycie dowolnej zgodnej implementacji parsera w standardowy sposób. Kod powinien być znacznie bardziej przenośny, a gdy zdasz sobie sprawę, że określony parser się zestarzał, możesz go zastąpić innym bez zmiany wiersza kodu (jeśli zrobisz to poprawnie).

Zasadniczo istnieją trzy sposoby standardowego przetwarzania XML:

  • SAX To najprostszy interfejs API. Czytamy XML poprzez zdefiniowanie klasy Handler, która odbiera dane wewnątrz elementów / atrybutów, gdy XML jest przetwarzany szeregowo. Jest to szybsze i prostsze, jeśli planujesz tylko odczytać niektóre atrybuty / elementy i / lub zapisać niektóre wartości z powrotem (Twoja sprawa).
  • DOM Ta metoda tworzy drzewo obiektów, które pozwala na losową modyfikację / dostęp do niego, dzięki czemu lepiej nadaje się do skomplikowanej manipulacji i obsługi XML.
  • StAX Jest to środek ścieżki między SAX a DOM. Po prostu piszesz kod, aby pobrać dane z analizatora składni, który Cię interesuje podczas przetwarzania.

Zapomnij o zastrzeżonych interfejsach API, takich jak JDOM lub Apache (tj. Apache Xerces XMLSerializer ), ponieważ spowoduje to powiązanie z konkretną implementacją, która może ewoluować w czasie lub utracić kompatybilność wsteczną, co spowoduje zmianę kodu w przyszłości, gdy będziesz chciał uaktualnić do nowa wersja JDOM lub dowolnego innego parsera, którego używasz. Jeśli będziesz trzymać się standardowego interfejsu API Java (używając fabryk i interfejsów), twój kod będzie znacznie bardziej modułowy i łatwiejszy w utrzymaniu.

Nie trzeba mówić, że wszystkie (nie sprawdziłem wszystkich, ale jestem prawie pewien) proponowanych parserów są zgodne z implementacją JAXP, więc technicznie możesz używać wszystkich, bez względu na to, które.

Fernando Miguélez
źródło
11
Właściwie 3 sposoby: StAX (javax.xml.stream) jest trzecim standardowym.
StaxMan
1
java-samples.com/showtutorial.php?tutorialid=152 (osobiście uwielbiam SAX)
kitokid
@kitokid Chrome mówi mi, że na tej stronie są paskudne rzeczy. Użyłem tego zamiast tego: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington
Dobry przegląd: tylko jedna rzecz, z którą się nie zgadzam - podczas gdy w przypadku przyrostowego / przesyłania strumieniowego, SAX i Stax są dobre, standardowy interfejs API wystarcza, w przypadku DOM tak nie jest (IMO): istnieją ważne powody dla specyficznych dla Java warunków, takich jak XOM, JDOM i DOM4J: niezależny od języka DOM jest dość kłopotliwy w użyciu.
StaxMan
130

Oto ładne porównanie dla DOM, SAX, StAX i TrAX (źródło: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html )

Cecha StAX SAX DOM TrAX

Typ interfejsu API                 Pull, streaming Push, streaming In memory tree Reguła XSLT

Łatwość użycia           Wysoka Średnia Wysoka Średnia

Możliwość XPath    Nie Nie Tak Tak

Procesor i pamięć     Dobry Dobry Różni się Różni się

Tylko do przodu        Tak Tak Nie Nie

Czytaj XML              Tak Tak Tak Tak

Napisz XML              Tak Nie Tak Tak

CRUD                      Nie Nie Tak Nie

Kadir
źródło
7
Możesz pisać XML za pomocą SAX. Zlew zapewnia implementację modułu obsługi, w której użytkownik może wywoływać zdarzenia SAX w celu wygenerowania danych wyjściowych XML. (Widzę, że stół jest pozyskiwany i nie jest oryginalnym materiałem, ale stół jest zły)
Dev
4

Oprócz SAX i DOM dostępne jest parsowanie STaX za pomocą XMLStreamReader, który jest parserem ściągania xml.


źródło
3

Odkryłem, że dom4j jest narzędziem do pracy z XML. Szczególnie w porównaniu do Xerces.

Brian Matthews
źródło
2

Nie polecałbym tego, ponieważ masz dużo „myślenia” w swojej aplikacji, ale używanie XSLT może być lepsze (i potencjalnie szybsze dzięki kompilacji XSLT do kodu bajtowego) niż manipulacja Java.


źródło
3
Lepsze, możliwe: szybsze, bardzo mało prawdopodobne.
StaxMan,
Czytanie, manipulowanie i pisanie XML jest dokładnie tym, do czego służy XSLT. To ładna, gotowa odpowiedź.
james.garriss,
1

Jeśli mniej zależy ci na wydajności, jestem wielkim fanem Apache Digester, ponieważ zasadniczo pozwala ona mapować bezpośrednio z XML na Java Beans.

W przeciwnym razie musisz najpierw przeanalizować, a następnie skonstruować swoje obiekty.

Uri
źródło
Nie muszę tworzyć komponentów Java Beans, po prostu trochę manipulować surowymi elementami XML i przeglądać niektóre elementy, aby uzyskać z nich dane, więc parser w stylu DOM jest prawdopodobnie moim idealnym rozwiązaniem.
Evan,
Tak, dom4j byłby prawdopodobnie lepszym rozwiązaniem ... Kiedyś intensywnie z niego korzystałem, dopóki nie poszedłem o jeden poziom wyżej do komory fermentacyjnej
Uri