2016-01-05 27 views
7

Nowości w analizie XML Próbuję zrozumieć różne technologie. Jest to mylące ilość różnych technologii dla różnych potrzeb:Jaka jest zaleta korzystania z JAXP zamiast DOM/SAX bezpośrednio w Javie?

  • W3C DOM
  • XOM
  • JDOM
  • JAXP
  • JAXB
  • DOM
  • SAX
  • StAX
  • TrAX
  • Woodstox
  • dom4j
  • Crimson
  • VTD-XML
  • Xerces-J
  • Castor
  • XStream
  • ...

Wystarczy wymienić tylko kilka.

DOM i SAX wydaje się być sposobem na niskim poziomie w celu analizowania i pracy na XML, więc postanowiłem skupić się na tych, które się wymienionych najbardziej w różnych źródłach i są na niskim poziomie:

DOM, SAX, JAXP.

Przeczytałem ogólnie o parserach na stackoverflow, JAXP-Tutorial from Oracle, XML-Parsing in general i tak dalej.

Próbowałem również kilka tutoriali, takich jak this german one i innych.

Trochę uczepię się teraz DOM i SAX, ale powód, dla którego używam JAXP, wciąż jest poza mną. Wydaje się, że jest to bardziej interfejs do używania DOM, SAX, ... wewnętrznie, ale dlaczego nie używać bezpośrednio DOM lub SAX?

Jaka jest zaleta korzystania z JAXP w warunkach laika?

+0

Kiedy pracuję z (manipulowaniem/tworzeniem) xml, zawsze używam DOM, ale to tylko moja osobista opinia! Myślę, że działa całkiem dobrze i zapewnia wszystkie potrzebne funkcje. – ParkerHalo

+0

To może pomóc https://jaxp.java.net/1.4/JAXP-FAQ.html –

+0

ParkerHalo: DOM wydaje się być bardzo intuicyjnym sposobem pracy z XML. Głównym powodem, dla którego nie należy używać DOM jest często określany jako rozmiar dokumentu, ale ludzie mówią tylko "jeśli dokument jest za duży, używaj SAX zamiast DOM", a nigdy nie definiuj, co oznacza "duże" - wiersze kodu, dokumentu rozmiar w MB, liczba obiektów xml, ... i pod którym to występuje. Czy 20 000 linii jest uważanych za duże lub 1 000 000 itd. – hamena314

Odpowiedz

6

(Chociaż nie powiedział tego wyraźnie, Twoje pytanie wydaje się odnosić wyłącznie do świata Java, a odpowiedź ta odzwierciedla.)

JAXP to zestaw interfejsów obejmujących analizowania XML, XSLT transformacji i Sprawdzanie schematu XML. Jeśli skupimy się tylko na analizie XML, głównym jej zadaniem jest udostępnienie mechanizmu lokalizowania implementacji parsera XML, dzięki czemu kod źródłowy nie zostanie zablokowany w konkretnym produkcie. Szczerze mówiąc, to ma obecnie ograniczoną wartość; jedynymi parserami SAX/DOM powszechnie używanymi są te osadzone w JDK i Apache Xerces. Apache Xerces jest lepszy pod każdym względem, z tym wyjątkiem, że musisz go pobrać osobno.

Jeśli chodzi o inne interfejsy analizowania, dzielą się one na dwie kategorie: interfejsy API oparte na zdarzeniach i oparte na drzewach interfejsy API. Interfejsy API oparte na drzewach są znacznie łatwiejsze w obsłudze, ale mogą korzystać z dużej ilości pamięci podczas obsługi dużych dokumentów.

Dwa dominujące interfejsy API oparte na zdarzeniach to SAX (push) i StAX (pull).Ciągnięcie parsowania jest dla wielu programistów prostsze, ponieważ można używać stosu programu do utrzymywania informacji o stanie; Niestety, interfejs API StAX jest nieco błędny - różne implementacje naprawiły luki na różne sposoby. Najbardziej kompletną i niezawodną implementacją StAX jest parser Woodstox; najbardziej kompletną i niezawodną implementacją SAX jest Apache Xerces. Ale nie należy używać metody analizy składniowej opartej na zdarzeniach, chyba że aplikacja naprawdę wymaga takiego poziomu wydajności (i jeśli nie masz wystarczającego poziomu doświadczenia, aby uniknąć utraty wszystkich przyrostów wydajności na poziomie aplikacji).

oparte na drzewach API, DOM pozostaje dominujący tylko dlatego, że został zdefiniowany przez W3C i jest zaimplementowany w JDK, i dlatego jest postrzegany jako "standardowy"; to także ten wspomniany we wszystkich książkach na ten temat. Jednak ze wszystkich modeli drzewek jest to niewątpliwie najgorszy projekt (głównie dlatego, że poprzedza wprowadzenie przestrzeni nazw). Alternatywy obejmują JDOM2, DOM4J, XOM i AXIOM. Zwykle polecam JDOM2 lub XOM.

+0

Masz rację, zmieniłem tytuł, aby mieć w nim "Java". Więc JAXP to jakieś pole zawierające DOM/SAX (XML Parsing), XSLT, ...? A jeśli używam DOM/SAX bezpośrednio, pośrednio "używam" JAXP, ponieważ DOM i SAX pochodzą od JAXP? Przeczytałem kilka opinii na temat XOM i wydaje się, że jest całkiem niezły, ale licencja (LGPL) może utrudnić mi korzystanie z moich projektów. Ale muszę o tym więcej przeczytać. – hamena314

+0

Należy zauważyć, że implementacja SAX/DOM w JDK jest oparta na Apache Xerces i jest w rzeczywistości lepiej zachowana niż oryginał. –

+0

@AndreasVeithen, tak, jest to widelec oryginału. Ale ma kilka bardzo poważnych błędów, które były znane z lat osła (no, przynajmniej od 2009 roku) i nigdy nie zostały naprawione. Nie dostajesz żadnego potwierdzenia, kiedy je zgłaszasz, po prostu wpadają w czarną dziurę. –

1

JAXP to nazwa firmy Sun (obecnie Oracle) dla kolekcji klas SAX i DOM, które pakują w pakiet JDK. Jeśli używasz JAXP, używasz także SAX i/lub DOM. To nie jest coś innego.

JAXP dodaje także kilka klas pomocniczych w pakiecie javax.xml.parsers, które wypełniają luki w SAX 1 i DOM 1, czyli stare wersje tych bibliotek sprzed 15 lat. Jednak nie są one konieczne w przypadku SAX2/DOM3, które są obecnie używane. Co gorsza, klasy javax.xml.parsers, takie jak DocumentBuilderFactory i SAXParserFactory, zostały zaprojektowane w sposób dezorientujący (domyślnie nie są domyślne w przestrzeni nazw), więc prawie zawsze są używane niepoprawnie. Następnie programiści przychodzą tutaj, aby zapytać, dlaczego ich program nie działa tak, jak powinien. Po prostu zignoruj ​​te klasy i zamiast tego użyj XMLReaderFactory (SAX 2) lub DOMImplementationLS (DOM 3).

+0

Świadomość przestrzeni nazw oznacza, że ​​w dokumencie XML 'firma' może mieć element XML o nazwie' adres', a później w dokumencie "pracownik" może mieć element XML nazwany również 'adresem '? Czy to, o czym mówisz? I pomimo używania różnicowych klas Factory (?), Takich jak 'DOMImplementationLS' zamiast' DocumentBuilderFactory', czy są jakieś inne różnice w użyciu? – hamena314

+0

@ElliotteRustyHarold Zawsze uważałem, że JAXP jest interfejsem, ale kiedy mówisz, że Oracle/Sun używa nazwy, aby odwołać się do "zbioru klas SAX i DOM" (to jest konkretnej implementacji), myślę, że mają rację. Mają bardzo słabe osiągnięcia w zakresie mylenia interfejsu z ich konkretną implementacją. –

+1

@ hamena314 Oprócz klas konstruktora i fabryki, nie ma ŻADNYCH różnic w użyciu między JAXP SAX i zwykłym SAX. Są to * same * klasy. Są one po prostu w pakiecie z JDK. Ta sama odpowiedź dla DOM. Przestrzeń nazw świadoma, w tym kontekście, ma związek z tym, jak parser przekazuje nazwy lokalne i kwalifikowane do jakich metod. Zawsze chcesz, aby ta funkcja była włączona, a klasy javax.xml.parsers domyślnie ją wyłączają. :-( –