DOM SAX XSLT w Java
Transkrypt
DOM SAX XSLT w Java
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Procesowanie dokumentów XML Programowanie w Javie 2 mgr inż. Michał Misiak Cechy XML Sformalizowany zapis informacji – restrykcyjne reguły Uniwersalność – możliwość zapisania wszelkich informacji (MathXML, SVG, …) Rozszerzalność – struktura informacji łatwa do rozszerzania z możliwością wykorzystania wcześniej zdefiniowanych struktur Czytelność – dokumenty XML są czytelne dla człowieka, a jednocześnie łatwe w analizie dla maszyny Międzynarodowość – możliwość korzystania z wielu stron kodowych lub UTF-8 Prostota – łatwość zrozumienia tworzenia dokumentów Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Cechy XML - wady Ograniczenia związane z hierarchiczną strukturą danych. Możliwość przedstawienia jednego typu relacji. W przypadku występowania większej liczby relacji trzeba korzystać z np. identyfikatorów Nadmiarowość informacji – znaczny narzut na znaczniki przechowujące metainformacje Problemy z wydajnością przetwarzania – ograniczenia pamięciowe dla dużych dokumentów Brak poprawnej implementacji standardów XML w aplikacjach Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Przyczyny popularności Duża popularność i chęć używania języków znakowania (SGML, HTML – powszechność) Sformalizowany sposób wymiany informacji Rozwój idei e-business (ebXML, XML nie wnosi nic nowego bo: Idea języków znakowania stosunkowo stara (SGML) Koncepcja hierarchicznych struktur danych również Sukces XML – zaprezentował stare koncepcje w nowej zrozumiałej i powszechnej formie Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Przetwarzanie dokumentów XML Wykorzystanie dokumentów XML w aplikacjach to: poznanie struktury pobranie zawartości poszczególnych elementów W celu optymalizacji czasu tworzenia aplikacji korzystających z XML większość języków definiuje własne API Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Rodzaje API API do przetwarzania dokumentów w oparciu o: DOM – Document Object Model – tworzenie struktury dokumentu SAX (Simple API for XML) – przetwarzanie dokumentu jako strumienia zdarzeń API zdefiniowane niezależnie od języka/platformy W przypadku języka Javy: Java API for XML Processing JAXP. JAXP pierwszy raz był wykorzystane na platformie J2EE Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 XML Parser XML Parser jest to procesor XML, który potrafi czytać strumień XML i przedstawić go w zrozumiałej formie dla aplikacji Aplikacja XML Parser XML XML API Dokument XML Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Poprawność dokumentu Poprawność składniowa (well-formed): Poprawność strukturalna (valid) Zgodność z regułami składni XML – gramatyka XML: Dokument niepoprawny składniowo nie może być przetworzony przez parser Brak możliwości wykorzystania zewnętrznych encji Zgodność z definicją dokumentu (XML Schema, DTD) – gramatyka dokumentu Parsery walidujące W większości praserów można ustalić poziom sprawdzania poprawności dokumentów Różnica w wydajności pomiędzy trybami pracy Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Parsery XML w Javie Wiele implementacji tego samego API przez różnych dostawców. Różnice w konfiguracji. http://java.sun.com/xml/jaxp - tutorial JAXP pozwala na integrację DOM API, SAX oraz procesorów XSLT JAXP oferuje mechanizm fabryki, który pozwala na wytworzenie instancji prasera o wymaganej konfiguracji Inne API dla XML w Javie: JAXB - Java API for XML Binding JAXR - Java API for XML Registries JAXM - Java API for XML Messaging JAX-RPC - Java API for XML-based RPC Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Document Object Model (1) DOM interfejs do dokumentu XML, sposób na reprezentację struktury dokumentu Reprezentacja struktury dokumentu w postaci drzewa Rozwijany przez W3C od połowy lat 90, jak część specyfikacji HTML. Pierwsza specyfikacja DOM 1 – 1998 http://www.w3.org/DOM/ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Document Object Model (2) Specyfikacja podzielona jest na poziomy (Level) poziom 0 – zaimplementowany we wszystkich przeglądarkach umożliwia dostęp do podstawowych elementów (formularzy, obrazków) Poziom 1 – możliwość modyfikowania dołączania węzłów. Dostępny z poziomu JavaScript Poziom 2 – obsługa zdarzeń i przestrzeni nazw Poziom 3 – 6 specyfikacji: Load and Save, XPath, Views & Formatting, Requirment, Validation Nieoficjalny Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Model programistyczny dla DOM zapisywanie Dokument XML Parser DOM Tworzenie drzewa czytanie Kontakty Nawigacja & Edycja Kontakt 1 Kontakt 2 Aplikacja Imię Nawisko Adres Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 DOM w Javie Interfejsy dla DOM zostały zdefiniowane w pakiecie: org.w3c.dom Standardowy parser znajduje się w pakiecie: javax.xml.parsers Utworzenie instancji parsera: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = factory.newDocumentBuilder(); Document mydoc = parser.parse(args[0]); Dokument DOM jest wyprowadzony i złożony z węzłów Node Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Interfejs dla węzła java.lang.String getNodeName() – zwraca nazwę węzła short getNodeType() – zwraca typ węzła np.: ATTRIBUTE_NODE, COMMENT_NODE, ELEMENT_NODE, TEXT_NODE. java.lang.String getPrefix() – zwraca prefiks przestrzeni nazw lub null w przypadku braku boolean hasChildNodes() – sprawdza, czy dany węzeł posiada dzieci NodeList getChildNotes() – zwraca listę węzłów dzieci boolean hasAttributes() – sprawdza czy węzeł ma atrybuty NamedNodeMap getAttributes() – zwraca listę (dostęp po nazwach atrybutów) z atrybutami węzła java.lang.String getNodeValue() – zwraca wartość węzła w zależności od jego typu dla TEXT_NODE zostanie zwrócony tekst. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Interfejs dla konkretnego typu węzła Obiekty odwzorowujące konkretny typ węzła: Element Document, Entity, Processing-Instruction Każdy z typów węzłów oferuje specyficzny interfejs, do którego dostęp uzyskujemy po prawidłowym zrzutowaniu węzła (zastosowanie metody getNodeType()) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Pozostałe metody interfejsu dla DOM Node appendChild(Node newChild) – załącza nowy węzeł jako dziecko dla aktualnego węzła Node insertBefore(Node newChild, Node refChild) – wkleja nowy węzeł na miejsce wskazane przez węzeł referencyjny Node removeChild(Node oldChild) – usuwa węzeł dziecko void setNodeValue(java.lang.String nodeValue) – umożliwia ermöglicht es den Wert (=Text) eines Knotens zu ändern. o void setPrefix(java.lang.String prefix) setzt den Namespace für den Knoten. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Simple API for XML Uproszone API do przetwarzania dokumentów XML Wykorzystuje koncepcję przetwarzania zdarzeniowego Zdefiniowano następujący zbiór podstawowych zdarzeń: Otwarcie znacznika Zamknięcie znacznika Wystąpienie PCDATA (Parsable Character Data) Wystąpienie CDATA (Character Data) Wystąpienie Processing Instruction Wystąpienie komentarza Wystąpienie deklaracji encji Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Simple API for XML Wady SAX nie umożliwia nawigowania po dokumencie, a tym samym na jego modyfikacje Zalety Prostota implementacji Możliwość przetwarzania złożonych dokumentów: wczytywanie i walidowanie. Oszczędność pamięci. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Model programistyczny czytanie Parser DOM start Dokument XML Wystąpienie zdarzeń handler Aplikacja handler handler Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 SAX w Javie Wymagane pakiety: org.xml.sax.*; org.xml.sax.helpers.*; Zdarzenia są automatycznie przekazywane do Javy, która wywołuje wcześniej przygotowane metody tzw. Handlers Handlers muszą być wyprowadzone z klasy: org.xml.sax.helpers.DefaultHandler Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Najważniejsze metody DefaultHandler void startDocument() – wołana na początku pracy parsera void endDocument() – sygnalizuje, że koniec dokumentu został osiągnięty void startElement(java.lang.String uri,java.lang.String localName, java.lang.String qName, Attributes attributes) – sygnalizuje pojawienie się określonego znacznika danego elementu. Parser przekazuje następujące informacje do aplikacji: Namespace (uri), Nazwa znacznika, prefiks (qName) jak również listę atrybutów Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Najważniejsze metody DefaultHandler (2) void endElement( java.lang.String uri, java.lang.String localName, java.lang.String qName) – sygnalizuje koniec znacznika dla danego elementu. Przekazywane są te same parametry co dla startElement() void characters(char[] ch, int start, int length) – wywoływana w przypadku wystąpienia tesktu w dokumencie. Tekst zostaje umieszczony w tablicy char. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Konstrukcja parsera Właściwą instancją parsera jest: org.xml.sax.XMLReader. Jest to jedynie interfejs, którego metody należy zaimplementować Można skorzystać z fabryki: XMLReader Parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parse rs.SAXParser"); Należy wskazać handlers za pomocą metody: setContentHandler() Parser jest uruchamiany za pomocą metody parse(), która jako argument otrzymuje URI Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 SAX vs. DOM Brak konieczności tworzenia drzewa niesie za sobą ograniczone zasoby związane z dyskiem SAX dzięki temu może parsować bardzo duże dokumenty Dzięki modelowi zdarzeniowemu oraz braku konieczności korzystania z dysku możliwe jest parsowanie XML ze strumienia Bardzo prosty interfejs programistyczny DOM jest znacznie potężniejszy w funkcjonalności Nawigacja po dokumencie Przetwarzanie Tworzenie dokumentu DOM często wykorzystuje SAX do stworzenia modelu drzewa Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 SAX+DOM=SAXDOMIX Nowe powołany do życia projekt open-source łączący zalety i funkcjonalności obydwu parserów: SAXDOMIX pozwala rozwiązywać np. problem zliczenia (SAX) i posortowania (DOM) danych Obiektowość DOM Szybkość i prostota SAX SAX buduje minimalny DOM wymagany do posortowania danych Pozwala to na oszczędność miejsca oraz przechwycenie dodatkowych informacji podczas parsowania http://www.devsphere.com/xml/saxdomix/ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Biblioteka JDOM Specjalnie zaprojektowany dla Javy model dokumentu Zdefiniowany w JSR 102 JDOM łączy w sobie zalety SAX i DOM Wspiera XSLT oraz XPath Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Deferred Parsing Umożliwia parsowanie jedynie istotnych części dokumentu Podobny w działaniu do SAXDOMIX Celem projektu jest budowa uniwersalnego interfejsu do drzewa, który umożliwia również przetwarzanie dużych dokumentów Podejście takie oferuje parser xerces v2 http://xml.apache.org/xerces2-j/. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Pull Parsing Idea podobna do Deferred Parsing – parsowanie jedynie tych części, które są konieczne Możliwość przeskakiwania części dokumentu XML w przeciwieństwie do SAX, który musi dokończyć parsowanie dokumentu Możliwość stworzenia dokumentu XML przy wykorzystaniu interfejsu, który nie jest kompatybilny z DOM http://www.extreme.indiana.edu/xgws/xsoap/xpp/ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Podsumowanie Przykładowe porównanie dostawców parserów: http://xmlbench.sourceforge.net/index.php?page=results.php W pracy: porównano różnego rodzaju metody parsowania dla różnych scenariuszy. Dla małych dokumentów najefektywniejszy okazał się XPP. Mała biblioteka sprawia, że może być wykorzystywany w rozwiązaniach mobilnych Przetwarzanie olbrzymich dokumentów: SAX Edycja dokumentu oraz częste nawigowanie: DOM Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Transformacje XSLT TransformerFactory static TransformerFactory newInstance() Transformer newTransformer() – tworzy transformer kopiujący (np. do zapisu drzewa DOM do pliku) newTransformer(Source src) – tworzy transformer z arkuszem styli setErrorListener(ErrorListener el) Transformer void transform(Source xmlSource, Result outputTarget) Przykład: import javax.xml.transform.*; import javax.xml.transform.stream.*; public class xslt1ex { public static void main(String[] args) throws Exception { TransformerFactory fact = TransformerFactory.newInstance(); Transformer trans = fact.newTransformer( new StreamSource("lenEx.xsl")); trans.transform(new StreamSource("lenEx.xml"), new StreamResult("lenEx.html")); } } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008 Dziękuje! Zapraszam na kolejne wykłady ;) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008