Łódź, 29 października 2012 roku Technologie mgr inż. Tomasz Węgliński email: tweglinski@kis.p.lodz.pl www: http://www.tweglinski.pl
WYKŁAD 8 XML & Java 2/15
Na następnym wykładzie… Plan wykładu Na wykładzie omówimy sobie następujące zagadnienia: Wczytywanie dokumentów XML Parsowanie XML za pomocą DOM i SAX Tworzenie dokumentów XML Kontrola poprawności dokumentów XML Wyszukiwanie informacji i XPath Transformacje XSL Na następnym wykładzie… Wykład 8: XML & Java 3/15
Przykłady wykorzystane w wykładzie pochodzą z książki: Literatura Przykłady wykorzystane w wykładzie pochodzą z książki: Źródło: http://helion.pl Wykład 8: XML & Java 4/15
Java + XML = przenośny kod + przenośne dane Dlaczego Java i XML? Zarówno Java jak i XML to języki darmowe i niezależne od platformy. Java + XML = przenośny kod + przenośne dane - Sun Microsystems (obecnie Oracle) - W drugiej połowie lat 90. IBM, Apache i inne firmy oraz organizacje opracowały szereg doskonałych bibliotek języka Java, które służyły do przetwarzania języka XML. Począwszy od wersji Java SE 1.4, firma Sun umieściła najważniejsze z nich w standardowej edycji platformy Java. Obecnie Java udostępnia szerszy wachlarz interfejsów, parserów, procesorów, struktur publikacji i narzędzi dla XML-a niż jakikolwiek inny język programowania. Wykład 8: XML & Java 5/15
Bardziej znane parsery, to: Apache Xerces, http://xml.apache.org Narzędzia Bardziej znane parsery, to: Apache Xerces, http://xml.apache.org IBM XML4J, http://alphaworks.ibm.com James Clark's XP, www.jclark.com OpenXML, www.openxml.org Oracle XML Parser, http://technet.oracle.com Tim Bray's Lark and Larval, www.textuality.com Najważniejsze procesory XML, to: Apache Xalan, http://xml.apache.org James Clarks's XT,www.jclark.com Lotus XSL Processor, www.alphaworks.ibm.com Oracle XSL Processor, http://technet.oracle.com Keith Visco's XSL:P, www.clc-marketing.com Michalel Kay's SAXON, http://users.iclway.co.uk Wykład 8: XML & Java 6/15
W ramach projektu Apache XML powstało wiele inicjatyw Projekt Apache W ramach projektu Apache XML powstało wiele inicjatyw mających na celu zaproponowanie nowych otwartych standardów opartych na XML. Projektami opartymi na Javie, są m.in.: Xerces - parser XML Xalan - procesor stylów XSLT Cocoon - publikacje webowe bazujące na XML FOP - procesor XSL-FO Xang - dynamiczne strony działające na serwerze w języku JavaScript SOAP - Simple Object Access Protocol Batik - narzędzie dla SVG (Scalable Vector Graphic) Crimson - parser XML, rozwinięcie parsera X SUN'a Wykład 8: XML & Java 7/15
Wczytywanie dokumentu XML Wczytywanie XML Wczytywanie dokumentu XML Procedura: Aby wczytać dokument XML potrzebny jest obiekt klasy DocumentBuilder, który uzyskamy z fabryki DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Wczytujemy plik z lokalnych zasobów: File f = . . . Document doc = builder.parse(f); Lub też z adresu URL: URL u = . . . Document doc = builder.parse(u); Lub też z dowolnego strumienia wejściowego: InputStream in = . . . Document doc = builder.parse(in); Wykład 8: XML & Java 8/15
Wczytywanie dokumentu XML (c.d.) Wczytywanie XML Wczytywanie dokumentu XML (c.d.) obiekt typu Document reprezentuje dokument XML za pomocą struktury drzewiastej utworzonej w pamięci. Składa się ona z obiektów, które implementują interfejs Node oraz jego interfejsy pochodne Wykład 8: XML & Java 9/15
Tworzenie dokumentu XML Tworzenie XML Tworzenie dokumentu XML Procedura: Tworzenie drzewa DOM, generacja pustego dokumentu za pomocą metody newDocument klasy DocumentBuilder: Document doc = builder.newDocument(); Do tworzenia elementów dokumentu wykorzystamy metodę klasy Document: Element rootElement = doc.createElement(rootName) Element childElement = doc.createElement(childName); Do tworzenia węzłów tekstowych użyjemy f-kcji createTextNode: Text textNode = doc.createTextNode(textContents); Dodajemy elementy do korzenia i odpowiednich węzłów: doc.appendChild(rootElement); rootElement.appendChild(childElement); childElement.appendChild(textNode); Wykład 8: XML & Java 10/15
Tworzenie dokumentu XML (c.d.) Tworzenie XML Tworzenie dokumentu XML (c.d.) Procedura: 4. Atrybuty elementów określamy korzystając z metody setAttribute klasy Element: rootElement.setAttribute(name, value); 5. Jeżeli chcemy dodać element DOCTYPE: Transformer t = TransformerFactory.newInstance().newTransformer(); t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, systemIdentifier); t.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, publicIdentifier); t.setOutputProperty(OutputKeys.INDENT, "yes"); t.setOutputProperty(OutputKeys.METHOD, "xml"); t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); t.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(file))); Wykład 8: XML & Java 11/15
Kontrola poprawności dokumentu XML względem jego DTD Walidacja DTD Kontrola poprawności dokumentu XML względem jego DTD Procedura: Informujemy fabrykę DocumentBuilderFactory, aby wykorzystywała weryfikację poprawności dokumentów: factory.setValidating(true); Aby parser ignorował odstępy między elementami (umyślne tabulacje): factory.setIgnoringElementContentWhitespace(true); Instalujemy obiekt obsługi błędów, implementujący interfejs ErrorHandler, który zawiera następujące trzy metody: void warning(SAXParseException exception); void error(SAXParseException exception); void fatalError(SAXParseException exception); Obiekt obsługi błędów instalujemy za pomocą metody: builder.setErrorHandler(handler); Wykład 8: XML & Java 13/15
Walidacja DTD Dodatkowe metody: Wykład 8: XML & Java 14/15
Kontrola poprawności dokumentu XML względem XML Schema Walidacja XML Schema Kontrola poprawności dokumentu XML względem XML Schema Procedura – taka sama jak przy DTD jednakże: Należy włączyć obsługę przestrzeni nazw nawet, gdy nie są one używane w dokumencie XML: factory.setNamespaceAware(true); Przygotowujemy fabrykę do obsługi schematów za pomocą następującego fragmentu kodu: final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); Zobaczmy to w praktyce! Wykład 8: XML & Java 15/15