Najlepszy parser XML dla Javy [zamknięty]

Muszę czytać małe (najwyżej kilka MB, kodowane UTF-8) pliki XML, grzebać wokół patrząc na różne elementy i atrybuty, być może zmodyfikować kilka i zapisać XML z powrotem na dysk (najlepiej z ładnym, wciętym formatowaniem).

Jaki byłby najlepszy parser XML dla moich potrzeb? Jest w czym wybierać. Niektóre, o których wiem są:

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

Rekomendacje?

Author: Elliot Chance, 2008-12-17

8 answers

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 to zrobić i musisz przyzwyczaić się do przetwarzania XML w strumieniach.

 78
Author: zehrer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-24 08:57:33

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 kiedy zdasz sobie sprawę, że określony parser stał się zbyt stary, możesz go zastąpić innym bez zmiany linii kodu (jeśli zrobisz to poprawnie).

Zasadniczo istnieją trzy sposoby obsługi XML w standardowy sposób:

  • SAX to jest najprostsze API. XML można odczytać, definiując klasę obsługi, która odbiera dane wewnątrz elementów / atrybutów, gdy XML jest przetwarzany w sposób szeregowy. Jest to szybsze i prostsze, jeśli planujesz tylko odczytywać niektóre atrybuty / elementy i / lub zapisywać niektóre wartości (Twój przypadek).
  • DOM ta metoda tworzy drzewo obiektów, które pozwala modyfikować / uzyskiwać do niego dostęp losowo, więc jest to lepsze dla skomplikowanej manipulacji i obsługi XML.
  • StAX to jest w środku ścieżka między SAX i DOM. Po prostu piszesz kod, aby pobrać dane z parsera, który Cię interesuje, gdy są przetwarzane.

Zapomnij o zastrzeżonych API, takich jak JDOM lub Apache (np. Apache Xerces XMLSerializer ), ponieważ będzie wiązać cię z konkretną implementacją, która może ewoluować w czasie lub stracić kompatybilność wsteczną, co sprawi, że zmienisz kod w przyszłości, gdy będziesz chciał uaktualnić do nowej wersji JDOM lub dowolnego używanego parsera. Jeśli trzymasz się Java standard API (używając fabryk i interfejsów) Twój kod będzie znacznie bardziej modułowy i możliwy do utrzymania.

Nie ma potrzeby mówić, że wszystkie (nie sprawdziłem wszystkich, ale jestem prawie pewien) proponowane parsery są zgodne z implementacją JAXP, więc technicznie można użyć wszystkich, bez względu na to, który.

 246
Author: Fernando Miguélez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-21 09:21:24

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

Funkcja StAX SAX DOM TrAX

Typ API Pull, streaming Push,streaming w drzewie pamięci XSLT Rule

Łatwość obsługi wysoka                    Medium High Medium

Możliwość XPath Nie Nie TAK TAK TAK

Procesor i pamięć dobra Dobra zmienna zmienna

Tylko Do Przodu Tak Tak Nie Nie

Odczyt XML Tak                    TAK TAK TAK

Zapis XML Tak nie tak tak

CRUD Nie Nie tak nie

 127
Author: Kadir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-14 15:35:04

Simple XML http://simple.sourceforge.net/ jest bardzo łatwe do serializacji obiektów.

 8
Author: asdf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-23 19:07:32

Oprócz SAX i DOM istnieje parsowanie STaX dostępne za pomocą xmlstreamreader, który jest parserem XML pull.

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-18 01:32:15

Znalazłem dom4j jako narzędzie do pracy z XML. Szczególnie w porównaniu do Xerces.

 3
Author: Brian Matthews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-24 09:04:57

Nie polecałbym tego, że masz dużo "myślenia" w swojej aplikacji, ale korzystanie z XSLT może być lepsze (i potencjalnie szybsze z kompilacją XSLT-to-bytecode) niż manipulacja Javą.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-18 01:42:47

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

W przeciwnym razie musisz najpierw parsować, a następnie konstruować obiekty.

 1
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-18 01:33:36