Wyklad11(Xml).

Download Report

Transcript Wyklad11(Xml).

Projektowanie warstwy serwera
Współpraca z XML
Projektowanie 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
2
Przykładowy opis xml
Projektowanie warstwy serwera
<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
3
xsd - przykład
Projektowanie warstwy serwera
<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
4
Projektowanie 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
5
Projektowanie 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
6
Projektowanie 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
7
Projektowanie 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
8
Projektowanie 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
9
Projektowanie warstwy serwera
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
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
Typ NodeList
• Length()
• item(i)
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
11
Projektowanie warstwy serwera
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
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie 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
13
Projektowanie 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
14
Projektowanie warstwy serwera
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());
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie 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
16
Projektowanie warstwy serwera
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.
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie warstwy serwera
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
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Projektowanie 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
19
Projektowanie warstwy serwera
Generacja JAXB
xjc nazwa_pliku.xsd
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
20
Projektowanie 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
21
Projektowanie 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
22
Projektowanie 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
23
Projektowanie 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
24
Projektowanie 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
25
Projektowanie warstwy serwera
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
26