Współpraca z XML

26
Projektowanie warstwy serwera Współpraca z XML

description

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. Marek

Transcript of Współpraca z XML

Page 1: Współpraca z XML

Projektowanie warstwy serwera

Współpraca z XML

Page 2: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

2Projektowanie warstwy serwera Plan wykładu

• Przykład pliku w formacie xml• Przetwarzanie DOM• Przetwarzanie SAX• JAXB

Page 3: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

3Projektowanie warstwy serwera 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>

Page 4: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

4Projektowanie warstwy serwera 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>

Page 5: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

5Projektowanie warstwy serwera Przetwarzanie SAX

UzytkownikHandler handler = new UzytkownikHandler();

SAXParser sp = new SAXParser();

sp.setContentHandler(handler);

sp.parse(getNazwa_pliku()+".xml");

if (!handler.getBledy().toString().equals(""))

{

....

}

Page 6: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

6Projektowanie warstwy serwera 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;

}

Page 7: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

7Projektowanie warstwy serwera 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;

}

Page 8: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

8Projektowanie warstwy serwera Przetwarzanie SAX – handler (III)

public void characters(char ch[], int start, int length)

{

String value = new String(ch, start, length);

otwarty_pusty = false;

}

Page 9: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

9Projektowanie warstwy serwera 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

Page 10: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

10Projektowanie warstwy serwera 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

Page 11: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

11Projektowanie warstwy serwera Typ NodeList

• Length()• item(i)

Page 12: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

12Projektowanie warstwy serwera 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

Page 13: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

13Projektowanie warstwy serwera 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

Page 14: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

14Projektowanie warstwy serwera 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);

Page 15: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

15Projektowanie warstwy serwera 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());

}

Page 16: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

16Projektowanie warstwy serwera 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);

Page 17: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

17Projektowanie warstwy serwera 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.

Page 18: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

18Projektowanie warstwy serwera 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

Page 19: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

19Projektowanie warstwy serwera 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

Page 20: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

20Projektowanie warstwy serwera Generacja JAXB

xjc nazwa_pliku.xsd

Page 21: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

21Projektowanie warstwy serwera 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();

Page 22: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

22Projektowanie warstwy serwera 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);

Page 23: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

23Projektowanie warstwy serwera 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);

Page 24: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

24Projektowanie warstwy serwera 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);

}

Page 25: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

25Projektowanie warstwy serwera package-info

@javax.xml.bind.annotation.XmlSchema(

namespace = "http://www.biblioteka.pl/biblioteka", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED

)

package domain.xml;

Page 26: Współpraca z XML

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

26Projektowanie warstwy serwera UzytkownikXML

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "UzytkownikXML", propOrder = {

"imie",

"nazwisko",

})

public class UzytkownikXML

{

String nazwisko;

String imie;

}