Projektowanie warstwy serwera Współpraca z XML
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 2 Plan wykładu Przykład pliku w formacie xml Przetwarzanie DOM Przetwarzanie SAX JAXB
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 3 Przykładowy opis xml Marek Odynca 34 Politechniki 30
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 4 xsd - przykład
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 5 Przetwarzanie SAX UzytkownikHandler handler = new UzytkownikHandler(); SAXParser sp = new SAXParser(); sp.setContentHandler(handler); sp.parse(getNazwa_pliku()+".xml"); if (!handler.getBledy().toString().equals("")) {.... }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 6 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; }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 7 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; }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 8 Przetwarzanie SAX – handler (III) public void characters(char ch[], int start, int length) { String value = new String(ch, start, length); otwarty_pusty = false; }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 9 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
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 10 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
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 11 Typ NodeList Length() item(i)
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 12 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
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 13 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
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 14 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);
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 15 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()); }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 16 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);
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 17 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.
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 18 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
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 19 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
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 20 Generacja JAXB xjc nazwa_pliku.xsd
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 21 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();
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 22 Unmarshalling (II) JAXBElement 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 ) unmarshaller.unmarshal(readerXml);
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 23 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);
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 24 Object public class ObjectFactory { private final static QName _Uzytkownik_QNAME = new QName(" = name = Uzytkownik") public JAXBElement createUzytkownik(UzytkownikXML value) { return new JAXBElement (_Uzytkownik_QNAME, UzytkownikXML.class, null, value); }
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego 25 namespace = " elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED ) package domain.xml;
Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego = "UzytkownikXML", propOrder = { "imie", "nazwisko", }) public class UzytkownikXML { String nazwisko; String imie; }