API pro práci s XML

Transkript

API pro práci s XML
API pro práci s XML
Jirka Kosek
Poslední modifikace: $Date: 2014/12/17 17:15:28 $
Copyright © 2001-2014 Jiří Kosek
Obsah
Úvod ........................................................................................ 3
Parsery XML ......................................................................... 4
Rozhraní pro přístup k dokumentu XML .................................... 5
Další charakteristiky parseru ................................................... 6
Sekvenční čtení ....................................................................... 7
Push parsery ........................................................................ 8
Pull parsery .......................................................................... 9
Stromová reprezentace ......................................................... 10
DOM .................................................................................. 11
Hierarchie tříd použitých v DOM ............................................. 12
Nejběžnější metody DOM ...................................................... 13
Další směr vývoje DOM ........................................................ 14
Rozšíření a varianty DOM ...................................................... 15
Generátory tříd ...................................................................... 16
Úvod .................................................................................. 17
Příklad schématu ................................................................. 18
Ukázka rozhraní vygenerované třídy ....................................... 19
Práce s dokumentem ........................................................... 20
Další API ............................................................................... 21
XSLT, XPath ........................................................................ 22
Další vývoj ......................................................................... 23
Podpora XML v jednotlivých jazycích ..................................... 24
Java .................................................................................. 25
.Net ................................................................................... 26
Další informace ..................................................................... 27
Další informace ................................................................... 28
Úvod
Parsery XML .............................................................................. 4
Rozhraní pro přístup k dokumentu XML ......................................... 5
Další charakteristiky parseru ........................................................ 6
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
(strana 3)
Parsery XML
• mnoho aplikací potřebuje číst (generovat) dokumenty XML
• dokumenty XML lze z aplikace číst jako „Unicode text with angle
brackets“
• pracné a nepohodlné
• pomalé na implementaci
• aplikaci většinou nezajímá XML jako text, ale infoset odpovídající
dokumentu
• parser je komponenta (knihovna), která umí přes rozhraní nabízet
infoset dokumentu aplikaci
• jednotlivé parsery se liší podporovanými rozhraními a dalšími
charakteristikami
Úvod
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
1 / 19 (strana 4)
Rozhraní pro přístup k dokumentu XML
• sekvenční (proudové)
• velmi rychlé a paměťově nenáročné
• dokument musíme zpracovat během jednoho průchodu
• standardní rozhraní – SAX (push-parser), StAX (pull-parser),
XMLReader (pull-parser), …
• stromová reprezentace:
• celý dokument je zpřístupněn jako hierarchie objektů
• dokument můžeme opakovaně a nelineárně procházet
• velká paměťová náročnost, pomalejší než sekvenční parsery
• pro chybný dokument se stromová reprezentace nevytvoří
• standardní rozhraní – DOM
• novější, specializovaná rozhraní – JDOM, DOM4J, XOM, XDocument,
…
• generátory tříd (data-binding)
Úvod
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
2 / 19 (strana 5)
Další charakteristiky parseru
• validující × nevalidující
• umí kontrolovat dokument oproti DTD, XML Schema, …
Obrázek 1. Validující parser
• validace je pomalejší než jen kontrola well-formdness
• podpora jmenných prostorů
• podpora XML katalogů
• podpora XInclude
• podporované jazyky a platformy
• podpora PSVI
Obrázek 2. Parser zpřístupňující PSVI
Úvod
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
3 / 19 (strana 6)
Sekvenční čtení
Push parsery ............................................................................. 8
Pull parsery ............................................................................... 9
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
(strana 7)
Push parsery
• nejznámější rozhraní SAX = Simple API for XML
• každý důležitý prvek dokumentu je aplikaci předáván ve formě události
• události:
• startDocument, endDocument
• startElement, endElement
• characters
• processingInstructions
• pro každou událost můžeme definovat vlastní obsluhu
• obsluha událostí má podobu třídy implementující rozhraní ContentHandler
• SAX je de facto standard podporovaný v mnoha aplikacích
Obrázek 3. Princip push-parseru
dokument XML
čtení a analýza
dokumentu
Sekvenční čtení
Copyright © 2001-2014 Jiří Kosek
SAX parser
proud události
aplikace
API pro práci s XML
4 / 19 (strana 8)
Pull parsery
• části XML dokumentu čteme sekvenčně podle svých potřeb
• přehlednější kód než v případě použití push-parserů (SAX)
• implementace – XmlReader v .Net, StAX v Javě, …
// vytvoření parseru
XMLInputFactory f = XMLInputFactory.newInstance();
XMLStreamReader r = f.createXMLStreamReader("faktura.xml");
// zpracování celého dokumentu XML
while (r.hasNext())
{
// přečtení dalšího prvku XML
r.next();
// zpracováváme jen elementy cena
if (r.getEventType() == XMLStreamConstants.START_ELEMENT
&& r.getLocalName().equals("cena"))
{
// přečtení sazby DPH
double sazbaDPH = Double.parseDouble(r.getAttributeValue(null, "dph")) ►
/ 100;
// přečtení obsahu elementu cena
double castka = Double.parseDouble(r.getElementText());
// provedení výpočtu
suma += castka;
sumaDPH += castka * sazbaDPH;
}
}
Obrázek 4. Princip pull-parseru
dokument XML
čtení a analýza
dokumentu
Sekvenční čtení
Copyright © 2001-2014 Jiří Kosek
pull parser
(StAX)
vyžádání další části
dokumentu
aplikace
API pro práci s XML
5 / 19 (strana 9)
Stromová reprezentace
DOM .......................................................................................
Hierarchie tříd použitých v DOM .................................................
Nejběžnější metody DOM ...........................................................
Další směr vývoje DOM .............................................................
Rozšíření a varianty DOM ...........................................................
Copyright © 2001-2014 Jiří Kosek
11
12
13
14
15
API pro práci s XML
(strana 10)
DOM
• DOM = Document Object Model
• standard W3C
• verze: DOM1, DOM2, DOM3, DOM4
• před zpracováním je celý dokument načten do paměti
• jednotlivé uzly stromu jsou reprezentovány objekty
• rozhraní objektů (použitelné metody) je dáno specifikací DOM
Stromová reprezentace
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
6 / 19 (strana 11)
Hierarchie tříd použitých v DOM
• všechny třídy jsou potomky Node
Stromová reprezentace
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
7 / 19 (strana 12)
Nejběžnější metody DOM
• informace o uzlu:
getNodeName()
getNodeValue()
getNodeType()
• pohyb po stromu dokumentu:
getChildNodes()
getParentNode()
getFirstChild()
getLastChild()
getPreviousSibling()
getNextSibling()
hasChildNodes()
• vytváření nových uzlů v paměti:
createElement()
createElementNS()
createDocumentFragment()
createTextNode()
createComment()
createCDATASection()
createProcessingInstruction()
createAttribute()
createAttributeNS()
createEntityReference()
• modifikace stromu:
insertBefore()
replaceChild()
removeChild()
appendChild()
• pomocí těchto metod lze udělat cokoliv, ale někdy je to opravdu hodně
pracné
Stromová reprezentace
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
8 / 19 (strana 13)
Další směr vývoje DOM
• DOM1
• DOM HTML – práce s HTML stránkou
• DOM Core – práce s obecným dokumentem XML
• DOM2
• DOM Events – obsluha událostí
• DOM Style – manipulace s připojenými kaskádovými styly
• DOM Traversal and Range – průchod dokumentem (iterátory) a práce
s bloky dokumentu
• Core, HTML – dále rozšířeny
• DOM3
• DOM Load and Save – rozhraní pro čtení/ukládání do souboru
• DOM Validation – validace dokumentu, práce se schématem, zjištění
elementů přípustných v daném místě apod.
• DOM XPath – vyhodnocování XPath výrazů nad DOM stromem
• DOM4 – konsolidace rozhraní a reflektování skutečného stavu
implementace v prohlížečích
Stromová reprezentace
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
9 / 19 (strana 14)
Rozšíření a varianty DOM
• DOM 1/2 je na mnoho úloh dost neohrabaný
• některé problémy jsou postupně odstraňovány (DOM3, DOM3 XPath)
• rozšíření DOM o užitečné metody
• např. knihovny MSXML a System.Xml umožňují pomocí vlastnosti
Text zjistit textový obsah libovolného uzlu (včetně poduzlů)
• tato možnost byla přidána až do DOM3 jako metoda getTextContent()
• knihovny optimalizované pro určitý jazyk nebo způsob použití
• JDOM, DOM4J, XOM
• snazší navigace po dokumentu, snadné zjištění obsahu elementu
• „novější“ knihovny umožňují proti DOM stromu pokládat XPath dotaz
lze použít i přímo v prohlížeči
var result = document.evaluate("//a", document, null, ►
XPathResult.ANY_TYPE, null);
while (node = result.iterateNext()) { alert(node.getAttribute("href")); }
Stromová reprezentace
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
10 / 19 (strana 15)
Generátory tříd
Úvod ......................................................................................
Příklad schématu ......................................................................
Ukázka rozhraní vygenerované třídy ............................................
Práce s dokumentem ................................................................
Copyright © 2001-2014 Jiří Kosek
17
18
19
20
API pro práci s XML
(strana 16)
Úvod
• z XML Schématu se vytvoří jednoúčelový parser
• pro každý element se vytvoří samostatná třída
• parser při načtení dokumentu vytvoří v paměti strukturu objektů
• psaní kódu pro čtení a manipulaci s XML dokumentem je velmi
jednoduché
• někdy se nazývá i „data-binding“
• lze použít pouze v případě, že schéma je pevně dané a dopředu známé
(což většinou je)
Generátory tříd
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
11 / 19 (strana 17)
Příklad schématu
<xsd:element name="faktura">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="odberatel" type="subjektInfoTyp" />
<xsd:element name="dodavatel" type="subjektInfoTyp" />
<xsd:element ref="polozka" minOccurs="1"
maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="cislo" type="xsd:string"
use="required" />
<xsd:attribute name="vystaveni" type="xsd:date"
use="required" />
<xsd:attribute name="splatnost" type="xsd:date"
use="required" />
<xsd:attribute name="vystavil" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:complexType name="subjektInfoTyp">
<xsd:sequence>
<xsd:element name="nazev" type="xsd:string" />
<xsd:element name="adresa" type="xsd:string" />
<xsd:element name="ico" type="xsd:string" />
<xsd:element name="dic" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="polozka">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="popis" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="cena" type="xsd:decimal" />
<xsd:element name="dph" type="xsd:decimal" />
<xsd:element name="ks" type="xsd:positiveInteger"
minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Generátory tříd
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
12 / 19 (strana 18)
Ukázka rozhraní vygenerované třídy
• čím generovat
• Castor, JAXB – Java
• xsd – .NET
public class faktura {
public subjektInfoTyp odberatel;
public subjektInfoTyp dodavatel;
public polozka[] polozka;
public string cislo;
public System.DateTime vystaveni;
public System.DateTime splatnost;
public string vystavil;
}
public class subjektInfoTyp {
public string nazev;
public string adresa;
public string ico;
public string dic;
}
public class polozka {
public string popis;
public System.Decimal cena;
public System.Decimal dph;
public string ks;
}
Generátory tříd
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
13 / 19 (strana 19)
Práce s dokumentem
// stream pro čtení dat ze souboru
StreamReader reader = new StreamReader("faktura.xml");
// serializátor založený na třídě vygenerované ze schématu
// pomocí: xsd /c faktura.xsd
XmlSerializer serializer = new XmlSerializer(typeof(faktura));
// do objektu f se deserializuje celý dokument faktury
faktura f = (faktura)serializer.Deserialize(reader);
// pomocné proměnné
decimal suma = 0;
decimal sumaDPH = 0;
// sečtení je hračka, nemusíme se starat ani o datové typy
foreach (polozka p in f.polozka)
{
suma += p.cena;
sumaDPH += p.cena * (p.dph/100);
}
// výpis statistiky
System.Console.WriteLine("Celkem Kč: " + suma);
System.Console.WriteLine("Celkem DPH: " + sumaDPH);
• dokument je samozřejmě R/W, takže jej můžeme v paměti i vytvořit,
upravovat a pak uložit
Generátory tříd
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
14 / 19 (strana 20)
Další API
XSLT, XPath ............................................................................. 22
Další vývoj .............................................................................. 23
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
(strana 21)
XSLT, XPath
• většina XSLT procesorů má API
• transformace lze spouštět programově
• vstup a výstup transformace nemusí být jen soubor, ale klidně DOM
strom, proud událostí SAX apod.
• některé parsery obsahují i procesor XPath a umožňují vyhodnocování
výrazů nad dokumentem – velmi pohodlné pro programátora
// vytvoření XPath navigátoru pro dokument
XPathDocument doc = new XPathDocument("faktura.xml");
XPathNavigator nav = doc.CreateNavigator();
// sečtení faktury přímo pomocí XPath výrazů
double suma = (double) nav.Evaluate("sum(/faktura/polozka/cena)");
System.Console.WriteLine("Celkem Kč: " + suma);
// vytvoření iterátoru pro všechny elementy cena
XPathNodeIterator iter = nav.Select("/faktura/polozka/cena");
// průchod vybranými uzly
while (iter.MoveNext())
{
double sazbaDPH = Double.Parse(iter.Current.GetAttribute("dph","")) / ►
100;
double castka = Double.Parse(iter.Current.Value);
suma += castka;
sumaDPH += sazbaDPH * castka;
}
// výpis statistiky
System.Console.WriteLine("Celkem Kč: " + suma);
System.Console.WriteLine("Celkem DPH: " + sumaDPH);
Další API
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
15 / 19 (strana 22)
Další vývoj
• pro každou novou technologii se dříve nepo později vytvoří standardní
API
• např. XQuery, XML Encryption, XML Signature
Další API
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
16 / 19 (strana 23)
Podpora XML v jednotlivých jazycích
Java ....................................................................................... 25
.Net ........................................................................................ 26
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
(strana 24)
Java
Obrázek 5. Struktura základních tříd rozhraní JAXP a jejich použití
Podpora XML v jednotlivých jazycích
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
17 / 19 (strana 25)
.Net
Obrázek 6. Nejdůležitější XML třídy .NETu a jejich vzájemné vztahy
Podpora XML v jednotlivých jazycích
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
18 / 19 (strana 26)
Další informace
Další informace ........................................................................ 28
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
(strana 27)
Další informace
1
• přehled XML API v Javě a .NET
2
• on-line kniha o práci s XML v Javě
1
2
http://www.kosek.cz/xml/api/index.html
http://cafeconleche.org/books/xmljava/
Další informace
Copyright © 2001-2014 Jiří Kosek
API pro práci s XML
19 / 19 (strana 28)

Podobné dokumenty

prezentace

prezentace Srovnání JS frameworků Jiří Kunčar & Jiří Martišek Technologie vývoje webových aplikací

Více

Rozhraní SAX, SAX vs. SAX2

Rozhraní SAX, SAX vs. SAX2 Přístup přes kvalifikované jméno nemusí fungovat správně, pokud nemá parser nastavenou vlastnost xmlReader.setFeature( “http://xml.org/sax/features/namespace-prefixes“, true);

Více

Data mining

Data mining DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(new BufferedInputStream(new FileInputStream(inpf), 1024)); … zpracování dat … catch (Exception ex) {

Více

XML schémata

XML schémata příliš volnosti škodí

Více

XML schémata

XML schémata Přínosy použití schématu • schéma je formální definice jazyka (výměnného formátu) založeného na XML • dokument XML můžeme kdykoliv během jeho životního cyklu validovat • validace = ověření shody d...

Více