1 Wykorzystanie XML-a we własnych aplikacjach: SAX, DOM, XML Data Binding
2 Modele dostępu do dokumentu XMLPozwalają programistom na dostęp do zawartości dokumentów XML na wysokim poziomie: korzystamy z abstrakcyjnych obiektów, nie troszczymy się o analizę leksykalną i składniową. SAX – Simple API for XML: model zdarzeniowy. DOM – Document Object Model: obiektowy model drzewa struktury, zwykle implementowany przy użyciu SAX. XML
3 Implementacja modelu – parserParser – moduł programistyczny analizujący dokument XML i udostępniający jego zawartość w postaci abstrakcyjnego modelu. Funkcjonalność parsera: analiza leksykalna i składniowa, sprawdzenie poprawności strukturalnej (tylko parser walidujący). Generyczność – niezależność od konkretnego języka! Po co abstrakcyjne modele: jednolity sposób programowania, niezależnie od użytego parsera, możliwość wymiany parsera, możliwość porównywania parserów.
4 SAX – Simple API for XML Idea: dokument XML jako ciąg zdarzeń,program reaguje na wybrane zdarzenia. Status: 1998: SAX 1.0 2000: SAX 2.0 – najważniejsze rozszerzenia: obsługa przestrzeni nazw, cechy (features) - wartości boolowskie, właściwości (properties) - dowolne obiekty, zmiany nazw wielu obiektów.
5 Działanie modelu SAX – przykład
6 SAX2 – pakiet org.xml.sax Interfejsy implementowane przez parser:XMLReader parse (2 metody), setContentHandler, ... Attributes getLength, getLocalName, getQName, getValue (2 metody). Opcjonalny: Locator Interfejsy implementowane przez użytkownika parsera: ContentHandler – zdarzenia: characters, ignorableWhitespace, startDocument, endDocument, startElement, endElement, processingInstruction, setDocumentLocator. ErrorHandler, DTDHandler, EntityResolver
7 SAX2 – pakiet org.xml.sax Standardowa klasa:org.xml.sax.InputSource – może pobierać dane z InputStream, Reader, String. Wyjątek: SAXException – podnoszony w przypadku wystąpienia błędu. Klasy pomocnicze (pakiet org.xml.sax.helpers): DefaultHandler – implementujemy podklasy tej klasy, XMLReaderFactory, AttributesImpl, LocatorImpl.
8 SAX – kroki implementacjiTworzymy podklasę klasy org.xml.sax.helpers.DefaultHandler. Pobieramy obiekt org.xml.sax.XMLReader z fabryki. Rejestrujemy stworzoną podklasę w parserze (XMLReader) metodami set...Handler. Wywołujemy metodę parse.
9 Filtry SAX Implementują interfejs org.xml.sax.XMLFilter.Rozszerzają klasę org.xml.sax.helpers.XMLFilterImpl. Specyficzne implementacje interfejsów: ContentHandler, DTDHandler, EntityResolver, ErrorHandler. Można je łączyć w łańcuchy: XMLReader reader; ... XMLFilterImpl f1 = new XMLFilterImpl(reader); XMLFilterImpl f2 = new XMLFilterImpl(f1); f2.parse(...);
10 Model DOM Dostęp do całego dokumentu (HTML lub XML), z wyjątkiem DTD.Części składowe: DOM Level 1 (październik 1998): podstawowe metody dostępu do struktury dokumentu, DOM Level 2 (listopad 2000): nowe cechy XML-a, np. przestrzenie nazw, Views – "widoki" dokumentu po zastosowaniu stylów CSS, Events – obsługa zdarzeń np. zmian zawartości dokumentu, Style – manipulowanie arkuszami stylów, Traversal and Range – "podróżowanie" po dokumencie XML. DOM Level 3 (w przygotowaniu): Load and Save – ładowanie i zapisywanie dokumentu, Validation – dostęp do definicji struktury dokumentu (DTD), XPath – dostęp do węzłów DOM przez wyrażenia XPath,
11 DOM Core Bazowa cześć specyfikacji DOM. Umożliwia:budowanie dokumentów, nawigację po strukturze dokumentów, dodawanie elementów i atrybutów, modyfikacje elementów i atrybutów, usuwanie elementów/atrybutów i ich zawartości. Wady: pamięciożerność, niska efektywność.
12 Drzewo DOM - przykład
13 DOM – najważniejsze interfejsyNode Document Element Comment Processing Instruction Attr Text CDATA Section
14 Interfejs Node Dostęp do zawartości: Manipulacja zawartością:getAttributes() getChildNodes() getFirstChild() getLastChild() getNextSibling () getPreviousSibling () getNodeName() getNodeValue() getNodeType() getOwnerDocument() getParentNode() hasChildNodes() Manipulacja zawartością: appendChild(Node) insertBefore(Node, Node) removeChild(Node) replaceChild(Node, Node) setNodeValue(String) setNodeName(String) Klonowanie: cloneNode(boolean)
15 Klasy pomocnicze DOM NamedNodeMap:tablica haszująca obiektów Node (np. atrybutów). NodeList: wektor obietków Node (np. dzieci danego węzła). DOMException: wyjątek podnoszony w przypadku błędnej modyfikacji węzła.
16 SAX DOM Przetwarzanie wsadowe.Całe drzewo dokumentu ładowane do pamięci. Oszczędny czasowo i pamięciowo. Kosztowny czasowo i pamięciowo. Dobry do wyławiania z dokumentu wybranych elementów. Pozwala wędrować po drzewie dokumentu. Dokument tylko do odczytu Pozwala tworzyć i modyfikować dokumenty.
17 Parsery XML – przegląd Java: XP Jamesa Clarka (niewalidujący),Xerces (walidujący, dostępny także dla C++ i Perla), XML4J - IBM XML Parser for Java (walidujący, DOM), Oracle XML Parser for Java (walidujący, DOM), ... przynajmniej 20 innych. C, C++: XML4C - IBM XML Parser for C++ (walidujący, DOM), Expat Jamesa Clarka.
18 Parsery XML – przegląd Perl:XML::Parser – pakiet wykorzystujący parser Expat J. Clarka napisany w C, XML::DOM. Python: PyXML. Microsoft XML Core Services (MSXML 4.0, komponent COM): możliwość dostępu z różnych języków programowania: ECMAScript, Java, Perl, Python, SQL, VisualBasic.
19 XML Data Binding Dokumenty XML a obiekty Javy:DTD/schemat odpowiada definicji klasy, dokument XML (instancja schematu) odpowiada obiektowi (instancji klasy). Pomysł: automatyczne generowanie klas z DTD/schematów, generowane klasy implementują serializację (i nic więcej). Implementacje: Dynamic XML, ObjectSpace, JAXB – Java Architecture for XML Binding, Sun Microsystems, Castor, Exolab, ...
20 Przykład: DXML public interface IPerson extends com.objectspace.xml.IDXMLInterface { // element Name public IName getName(); public void setName(IName arg0); // element Phone public void addPhone(String arg0); public int getPhoneCount(); public void setPhones(Vector arg0); public String[] getPhones(); public void setPhones(String[] arg0); public Enumeration getPhoneElements(); public String getPhoneAt(int arg0); public void insertPhoneAt (String arg0, int arg1); public void setPhoneAt (String arg0, int arg1); public boolean removePhone (String arg0); public void removePhoneAt(int arg0); public void removeAllPhones(); }
21 DXML: jak z tego korzystaćPrzygotowanie DTD. Wygenerowanie klas. Korzystanie w kodzie w Javie: import com.objectspace.xml.*; ... xmlDocument = Xml.openDocument(new File("phonebook.xml")); IPhonebook phonebook = (IPhonebook) xmlDocument.getRoot();