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. MarekTRANSCRIPT
Projektowanie warstwy serwera
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
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>
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>
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(""))
{
....
}
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;
}
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;
}
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;
}
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
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
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
11Projektowanie warstwy serwera Typ NodeList
• Length()• item(i)
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
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
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);
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());
}
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);
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.
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
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
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
20Projektowanie warstwy serwera Generacja JAXB
xjc nazwa_pliku.xsd
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();
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);
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);
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);
}
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;
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;
}