260 likes | 368 Views
Współpraca z XML. Plan wykładu. P rzykład pliku w formacie xml P rzetwarzanie DOM P rzetwarzanie SAX JAXB. Przykładowy opis xml. <st:Uzytkownik> <st:Imie kod="16">Marek</st:Imie> <st:Adres> <st:Ulica kod=”93-161">Odynca</st:Ulica> <st:Numer>34</st:Numer> </st:Adres>
E N D
Plan wykładu • Przykład pliku w formacie xml • Przetwarzanie DOM • Przetwarzanie SAX • JAXB Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przykładowy opis xml <st:Uzytkownik> <st:Imie kod="16">Marek</st:Imie> <st:Adres> <st:Ulica kod=”93-161">Odynca</st:Ulica> <st:Numer>34</st:Numer> </st:Adres> <st:Adres> <st:Ulica kod=”93-150">Politechniki</st:Ulica> <st:Numer>30</st:Numer> </st:Adres> </st:Uzytkownik> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
xsd - przykład <xsd:complexType name="tUzytkownik"> <xsd:sequence> <xsd:element name=”Imie" type="TImie"/> <xsd:element name=”Adres" type="TAdres" maxOccurs=”unbounded” minOccurs="0"/> </xsd:sequence> </xsd:complexType> <xsd:simpleContent name=”Timie”> <xsd:extension base="xsd:string"> <xsd:attribute name="kod" type="xsd:byte" use="required"/> </xsd:extension> </xsd:simpleContent> Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przetwarzanie SAX UzytkownikHandler handler = new UzytkownikHandler(); SAXParser sp = new SAXParser(); sp.setContentHandler(handler); sp.parse(getNazwa_pliku()+".xml"); if (!handler.getBledy().toString().equals("")) { .... } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przetwarzanie SAX – handler (I) public UzytkownikHandler() { bledy.append(""); } public void startElement(String uri, String localName, String qName, Attributes attributes) { curr_name_tag = localName; otwarty_pusty = true; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przetwarzanie SAX – handler (II) public void endElement(String uri, String localName, String qName) { if (otwarty_pusty) { bledy.append("Pusty tag: "+curr_name_tag); } otwarty_pusty = false; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przetwarzanie SAX – handler (III) public void characters(char ch[], int start, int length) { String value = new String(ch, start, length); otwarty_pusty = false; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Typ Node • parentNode - węzeł nadrzędny • nodeName - nazwa węzła • nodeValue – wartość węzła • nodeType – typ węzła • attributes – atrybuty węzła • lastChild – ostatni węzeł potomny • firstChild – pierwszy węzeł potomny • childNodes – lista węzłów potomnych Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Metody klasy Node • replaceChild(n,n) - zamienia istniejący węzeł potomny z podanym węzłem • removeChild(n) - usuwa wskazany węzeł potomny • insertBefore(n,n) - dołącza nowy węzeł jako węzeł potomny przed wskazanym węzłem • cloneNode(b) – generuje kopię głęboką węzła • appendChild(n) – dołącza nowy węzeł jako ostatni węzeł potomny Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Typ NodeList • Length() • item(i) Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Typ Dokument • Typ Document modeluje całe drzewo DOM; wszystkie węzły drzewa są jego potomkami • documentElement - element najwyższego poziomu w dokumencie • getElementsByTagName(”s”) - zwraca listę węzłów o podanej nazwie • createElement(s) - tworzy nowy element Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Typ Element • Typ Element modeluje węzeł reprezentujący parę znaczników XML • tagName - nazwa węzła • setAttributeNode(n) wstawia nowy węzeł atrybutu • setAttribute(s,s) - ustawia nową wartość atrybutu • removeAttribute(s) - usuwa wartość podanego atrybutu • getAttributeNode(s) - zwraca węzeł podanego atrybutu • getAttribute(s) - zwraca wartość podanego atrybutu Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przetwarzanie DOM (I) DOMParser dp = new DOMParser(); Node titleNode = null; NodeList titleNodeList = null; NodeList titleNodeList2 = null; XSDBuilder builder = new XSDBuilder(); dp.setXMLSchema((XMLSchema)builder.build(nazwaXsd)); p.setValidationMode(XMLParser.SCHEMA_VALIDATION); dp.setPreserveWhitespace (true); dp.parse(nazwaXml); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Przetwarzanie DOM (II) XMLDocument xmlDoc = dp.getDocument(); titleNodeList = xmlDoc.getElementsByTagName(„Adres"); String ulica = titleNodeList.item(0).getFirstChild().getNodeValue(); titleNodeList2 = titleNodeList.item(0). getChildNodes(); for (int i=0; i<titleNodeList2.getLength(); j++) { titleNode = titleNodeList2.item(j); if (titleNode.getNodeName().equals(„numer")) System.out.println(titleNode.getFirstChild().getNodeValue()); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
XSLT XSLProcessor xslProc = new XSLProcessor(); dp.parse(xslt_name); XMLDocument xmlDoc = dp.getDocument(); XSLStylesheet xsl = xslProc.newXSLStylesheet(xmlDoc); XMLDocumentFragment htmlDoc =slProc.processXSL(xsl, xmlDoc); htmlDoc.print(wyjscie2); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
JAXB - Java Architecutre for XML Binding • JAXB to standard definiujący dostęp do plików XML-owych z poziomu języka programowania. Filozofia JAXB jest trochę inna niż SAX i DOM: nie ma tu ogólnego interfejsu do parsowania plików, zamiast tego jest interfejs tworzony na podstawie DTD lub XML-Schemy. W praktyce wygląda to tak, że dostajemy kompilator schematów (lub dtd), który z tych schematów generuje klasy - dla każdego elementu XML powstaje jedna klasa. Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Zalety w stosunku do SAX i DOM • cały plik jest w pamięci - łatwiejszy dostęp do pliku • JAXB umożliwia modyfikację i zapisywanie dokumentu do pliku. SAX jest przeznaczony tylko do odczytu • nie ma narzutu na generyczność DOM-a, w pamięci jest tylko to co trzeba • bardziej intuicyjny dostęp do dokumentu, zamiast metodami typu getFirstChild() wykonywane są metody tupu item.getImie(), • nie trzeba znać struktury dokumentu Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Podstawowe operacje udostępniane przez JAXB • unmarshalling - zamiana pliku XML na obekty java • weryfikacja - sprawdzenie poprawności pliku xml z XSD (DTD) • marshalling - zamiana obiektów java na dokument XML Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Generacja JAXB xjc nazwa_pliku.xsd Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Unmarshalling (I) JAXBContext jc = JAXBContext.newInstance(”domain.xml" ); Unmarshaller u = jc.createUnmarshaller(); TUzytkownik uzytkownik = (TUzytkownik) u.unmarshal( new FileInputStream(„przyklad.xml")); TImie imie = uzytkownik.getImie(); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Unmarshalling (II) JAXBElement<UzytkownikXML> uzytkownik = null; JAXBContext jc = JAXBContext.newInstance("domain.xml"); ObjectFactory objectFactory = new ObjectFactory(); Unmarshaller unmarshaller = jc.createUnmarshaller(); String plikXml = new String(contents, "UTF-8"); Reader readerXml = new StringReader(plikXml); uzytkownik = (JAXBElement<UzytkownikXML>) unmarshaller.unmarshal(readerXml); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
marshalling JAXBContext jc = JAXBContext.newInstance("domain.xml"); ObjectFactory objectFactory = new ObjectFactory(); StringWriter sw = new StringWriter(); marshaller = jc.createMarshaller(); marshaller.setProperty("jaxb.formatted.output", true); marshaller.setProperty("com.sun.xml.internal.bind. namespacePrefixMapper", new PrefixMapper()); marshaller.marshal(objectFactory. createUzytkownik(UzytkownikXML), sw); Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Object Factory @XmlRegistry public class ObjectFactory { private final static QName _Uzytkownik_QNAME = new QName("http://www.biblioteka.pl/biblioteka", ”Uzytkownik"); @XmlElementDecl(namespace = ”http://www.biblioteka.pl/biblioteka", name = ”Uzytkownik") public JAXBElement<UzytkownikXML> createUzytkownik(UzytkownikXML value) { return new JAXBElement<UzytkownikXML> (_Uzytkownik_QNAME, UzytkownikXML.class, null, value); } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
package-info @javax.xml.bind.annotation.XmlSchema( namespace = "http://www.biblioteka.pl/biblioteka", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED ) package domain.xml; Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
UzytkownikXML @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "UzytkownikXML", propOrder = { "imie", "nazwisko", }) public class UzytkownikXML { String nazwisko; String imie; } Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego