Obsah přednášky ► XML ► DOM ► SAX ► XPath ► XSL
transformace
1/46
Co je XML?
XML je meziplatformní, softwarově a hardwarově nezávislý a standardizovaný nástroj pro přenos informace
2/46
Co je XML? ► EXtensible ►
Markup Language
Rozšiřitelný značkovací jazyk
► Značkovací ► Popisuje ► Tagy
jazyk podobně jako HTML
obsah nikoliv formu
nejsou součástí jazyka
► Kromě
samotných dat obsahuje i popis organizace dat
► Standardizovaný
formát (W3C)
3/46
XML nedělá nic ► Jazyk
XML nebyl navržen k tomu, aby něco dělal...
►
Strukturování dat
►
Ukládání dat
►
Posílání dat
► Příklad
Eva <pro>Adam Sejdeme se u stromu...
4/46
K čemu použít XML? ►K ►
►K ►
►K ►
výměně dat XML může být použito k výměně dat mezi nekompatibilními systémy
ukládání dat XML ukládá do člověkem čitelného textového souboru strukturovaná data
větší využitelnosti dat Data lze prohlížet ve specializovaných aplikacích, ale i v jednoduchých prohlížečích
5/46
XML syntax ► Pravidla ►
Jednoduchá
►
Přesná
►
Snadno pochopitelná
►
Snadno použitelná
► Snadná
manipulace s XML dokumenty
6/46
XML syntax ► Příklad
Eva <pro>Adam Sejdeme se u stromu...
7/46
XML syntax ► První
řádka musí deklarovat verzi XML, případně použité kódování
► Každý
XML element musí obsahovat odpovídající uzavírací tag
►
Ne jako u HTML řádka 1
řádka 2
► XML ►
tagy jsou case sensitive
Ne jako u HTML
tučný text 8/46
XML syntax ► XML ►
elementy musí být správně vhnízďovány
Ne jako u HTML
tučně a italikou
► XML
dokument musí obsahovat právě jeden kořenový element
►
Příklad
9/46
XML syntax ► XML
atributy musí být vždy uzavřeny v apostrofech či uvozovkách
►
Ne jako u HTML
► Bílé ►
znaky v XML dokumentu jsou zachovány
Ne jako u HTML toto je 1 mezera
► Komentáře
jsou stejné jako u html
10/46
XML elementy ► Elementy ►
Příklad Eva <pro>Adam 7. den Sejdeme se u stromu...
► Způsobí ►
jsou rozšiřitelné
přidání tagu pád aplikace?
NE! Aplikace se s neznámým tagem vypořádá tak, že ho ignoruje
11/46
XML elementy ► Elementy
jsou v příbuzenském vztahu
►
poznámka je kořenový element
►
poznámka je rodičovský element elementů od, pro, datum a text
►
od, pro, datum a text jsou dětské elementy elementu poznámka
►
od, pro, datum a text jsou sourozenecké elementy
12/46
XML elementy ► Elementy
mohou mít různý obsah
►
Obsahují elementy
►
Kombinovaný obsah
►
Jednoduchý obsah
►
Prázdný obsah
►
Atributy
13/46
XML elementy ► Pravidla
pro názvy
►
Názvy mohou obsahovat písmena, čísla a jiné znaky
►
Názvy nesmí začínat číslem či interpunkčním znakem
►
Názvy nesmí začínat slovem XML (xml, Xml,...)
►
Názvy nesmí obsahovat mezery
► Názvy
mohou být libovolně dlouhé (lepší jsou stručné a výstižné)
► Názvy
by neměly obsahovat znaky . a -
► Akcentované
znaky jsou povolené, ale... 14/46
XML atributy ► Elementy ► Atribut ►
mohou obsahovat atributy
je dvojice název, hodnota
Příklad v HTML Domů
► Obecně
se atributy používají pro infromace stojící „mimo“ data
►
Příklad adam.gif
15/46
XML atributy ► Pro
názvy atributů platí stejná pravidla jako pro elementy
► Hodnoty
atributů musí být uzavřeny v apostrofech či uvozovkách
►
Pokud jsou v uvozovkách, mohou obsahovat apostrofy a opačně
16/46
XML atributy ► Atributy ► Proč
lze nahradit elementy
se snažit vyhnout atributům
►
Nemohou obsahovat více hodnot
►
Nelze je snadno rozšiřovat
►
Neumožňují popsat struktury
►
Je složitější s nimi programově zacházet
►
Lze složitěji testovat validnost XML
► Dokumenty
obsahující příliš atributů jsou hůře
čitelné
17/46
XML validace ► Well-formed ►
XML
Dokument má validní syntax Eva <pro>Adam 7. den Sejdeme se u stromu... Adam <pro>Eva bez data Tak teda jo... 18/46
XML validace ► Validní ►
XML
Splňuje DTD nebo XML schema
► DTD
nebo XML schema
►
Definují elementy a atributy, které se mohou vyskytnout
►
Definují příbuznost elementů (rodiče, děti)
►
Pořadí a počet dětí
►
Typy elementů a atributů
►
...
19/46
XML schema ► DTD
je první možnost jak popsat XML
► XML
schema je modernější alternativa k DTD
►
Podpora datových typů a omezení
►
Používají XML syntax
►
Větší bezpečnost komunikace (např. datum 200503-11)
►
Rozšiřitelné
20/46
XML schema ► Příklad <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified"> <xs:element name="zpráva"> <xs:complexType> <xs:sequence> <xs:element name="od" type="xs:string"/> <xs:element name="pro" type="xs:string"/> <xs:element name="datum" type="xs:date"/> <xs:element name="text" type="xs:string"/>
21/46
Validace XML v .NETu ► Specifikace
struktury dat
►
Document Type Definition (DTD)
►
XML Schema Definition (XSD)
►
Specifikace viz http://w3c.org
► Validace ►
Třída XmlValidatingReader
►
Konstruktoru předáme XmlTextReader
►
Kolekce Schemas – přidáme schéma
►
Událost ValidationEventHandler (pokud čtený soubor neodpovídá schématu) 22/46
Validace XML v .NETu ► Příklad
const string path = @"../../"; const string xmlPath = path + @"\zpravy.xml"; const string xsdPath = path + @"\zpravy.xsd"; XmlValidatingReader reader = new XmlValidatingReader(new XmlTextReader(xmlPath)); XmlSchemaCollection schemaCollection = new XmlSchemaCollection(); schemaCollection.Add("http://tempuri.org/zpravy1.xsd",xsdPath); reader.Schemas.Add(schemaCollection); Console.Write("Validace:"); reader.ValidationEventHandler += new ValidationEventHandler(reader_ValidationEventHandler); while(reader.Read()) { Console.Write("."); } Console.WriteLine("\n"); ... 23/46
Podpora .NETu pro XML ► Dokumentově
orientovaný přístup
►
DOM – Document Object Model
►
Načte celý soubor najednou
►
Širší možnosti úprav
► Sekvenční
přístup
►
SAX – Simple API for XML
►
Postupné procházení souborem
►
Vhodné pro velká data
DOM ► Document ► Standard
Object Model
W3C
► Umožňuje
načtení celého souboru (stromu) a libovolně jej procházet
► Paměťově
náročný
► Vhodný
pro krátké soubory se složitou strukturou
► Umožňuje
XML
jednotný přístup ke čtení i zápisu
25/46
DOM v .NETu ► Namespace ► Třída
System.Xml
XmlDocument
►
Zapouzdřuje celý dokument
►
Přistupuje k dokumentu jako ke stromové struktuře
►
Poskytuje metody pro načtení a uložení
►
►
Load(string)
►
Save(string)
Poskytuje přístup ke kořenu ►
XmlElement DocumentElement
26/46
DOM v .NETu ► Třída
XmlNode
►
Abstrakce pro uzel XML stromu
►
Může být
►
►
Element
►
Text
Poskytuje přístup k ►
Rodiči
►
Dětem
►
Aktributům
27/46
DOM v .NETu ► Třída
XmlNode
Eva <pro>Adam
zprávy ParentNode
Adam <pro>Eva
NextSibling zpráva
ChildNodes
FirstChild od
zpráva
LastChild pro
od
pro
28/46
DOM v .NETu ► Třída ►
string Name ►
►
►
XmlNode
Jméno elementu (pro textové uzly #text)
string Value ►
Text textového uzlu
►
Pro elementy null
XmlAttributeCollection Attributes ►
Kolekce atributů ►
Naplněny Name i Value
29/46
DOM v .NETu ► XmlNode
je abstraktní třída
► Ani
odděděné třídy nemají veřejné konstruktory
► Uzel
se musí vytvořit pro konkrétní dokument
►
XmlDocument x.CreateElement(string)
►
…
► Vytvořený
uzel možno zařadit na správné místo do stromu
30/46
DOM v .NETu ► Příklad XmlDocument zpravy = new XmlDocument(); zpravy.Load("../../zpravy.xml"); XmlElement od = zpravy.CreateElement("od"); od.InnerText = "Ja"; XmlElement pro = zpravy.CreateElement("pro"); pro.InnerText = "Ty"; XmlElement text = zpravy.CreateElement("text"); text.InnerText = "Ahoj z XML"; XmlElement zprava = zpravy.CreateElement("zpráva"); zprava.AppendChild(od); zprava.AppendChild(pro); zprava.AppendChild(text); zpravy.DocumentElement.AppendChild(zprava); zpravy.Save("../../nove_zpravy.xml");
31/46
DOM v .NETu ► Vytvoření
nového dokumentu
►
Pro vytvoření nového dokumentu je nutné udělat malý trik
►
Vytvořit obsah dokumentu pomocí metody LoadXml(string)
►
Příklad
XmlDocument zpravy = new XmlDocument(); zpravy.LoadXml(" ");
32/46
SAX ► Simple ► Není
API for XML
standardizované
► Sekvenční
přístup k datům
► Read-only
nebo Write-only
► Vhodné ►
pro velké soubory
Menší paměťová náročnost
33/46
SAX v .NETu ► Třída
XmlTextReader
► Chová
se jako ukazovátko do XML souboru
► Konstruktor
otevře ho
připojí instanci ke XML souboru a
XmlTextReader(string FileName) ► Na
konci vhodné volat Close()
34/46
SAX v .NETu ► Třída ►
XmlTextReader
Ukazuje vždy na nějaký uzel XML ►
Property XmlNodeTyp NodeType ►
XmlDeclaration, Element, Text, EndElement, WhiteSpace
►
Property string Name
►
Property string Value
►
Postup na další uzel – Read()
►
Přeskakuje atributy
►
Standardně zpracovává i bílé znaky ►
Property WhiteSpaceHandling 35/46
SAX v .NETu ► Atributy ►
►
v XmlTextReaderu
Property int AttributeCount ►
Počet zbývajících atributů
►
Je-li >0 pak volat
Metoda MoveToNextAttribute ►
Kurzor se posune na další atribut
►
Name a Value se nastaví na odpovídající hodnoty
►
AttributeCount se sníží
36/46
SAX v .NETu ► Třída
XmlTextWriter
►
Konstruktor vyžaduje TextWriter nebo jméno souboru a kódování
►
WriteStartDocument()
►
WriteStartElement(string Name)
►
WrtieAttributeString(string Name, string Value)
►
WriteElementString(string Name, string Text)
►
WriteString(string Text)
►
WriteEndElement()
►
WriteEndDocument() 37/46
SAX v .NETu ► Příklad
XmlTextWriter writer = new XmlTextWriter("../../zpravySAX.xml",System.Text.Encoding.Get Encoding("Windows-1250")); writer.Formatting = Formatting.Indented; writer.WriteStartDocument(); writer.WriteStartElement("zprávy"); writer.WriteStartElement("zpráva"); writer.WriteElementString("od","Já"); writer.WriteStartElement("pro"); writer.WriteString("Ty"); writer.WriteEndElement(); writer.WriteStartElement("text"); writer.WriteString("Zpráva o zápisu pomocí SAX..."); // tady chybí WriteEndElement – dokument se zapíše bez // chyby, ale nespoléhat na to!!! writer.WriteEndDocument(); writer.Close();
► Za
správnost ručí programátor!!! 38/46
XPath ► Co
je XPath
►
Syntax pro definování části XML dokumentu
►
Používá výrazy k navigaci v XML dokumentu ►
Výrazy se podobají cestě na disku
►
Je W3C standard
►
/zprávy/zpráva ►
Určuje všechny elementy zpráva podřízené elementu zprávy, na úrovni kurzoru (obvykle kořen)
39/46
XPath predikáty ► Predikát
– podmínka
►
Na vnitřní uzel – [Node = 'text']
►
Na atribut - [@attribute = 'value']
► Možno
použít operátory <,>,=,!=,>=,<=
► Možno
použít logické operátory and a or
► /zprávy/zpráva[od
= 'Adam' or od =
'Eva']
40/46
XPath v .NETu ► XmlNodeList
XmlNode.SelectNodes(string
xpath) ►
Možno i nad XmlDocument (je potomek)
►
Podobně SelectSingleNode (vrací pouze první)
► Namespace
System.Xml.XPath
►
XPathDocument
►
XPathNavigator XPathDocument.CreateNavigator()
►
XPathNodeIterator XPathNavigator.Select(string xpath) ►
Current, MoveNext, Value, … 41/46
XSLT ► XML
Stylesheet Transformations
► Umožňuje
(HTML,...)
► Standard
převádět XML do jiných formátů
W3C
► XSL
popisuje jakým způsobem má XML vypadat
►
XSL je XML ►
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transfo rm">
42/46
XSLT ► XSLT ►
tamplate
Jakým způsobem má být značka přeložena <xsl:template match=“path"> …
► Uvnitř
aktivní
►
<xsl:value-of select=“path”> ►
►
Vypíše obsah značky
<xsl:for-each select=“path”>… ►
►
šablony je vždy některý XML uzel
Iteruje výsledkem XPath cesty
<xsl:apply-templates select=“path”/>
43/46
XSLT ► Příklad
(zpravy.xsl)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> Od Pro Text <xsl:for-each select="zprávy"> <xsl:apply-templates select="zpráva"/>
<xsl:template match = <xsl:value-of <xsl:value-of <xsl:value-of
"zpráva"> select="od"/> select="pro"/> select="text"/>
44/46
XSLT ► Příklad
(zpravy.css)
► Příklad
(zpravy.xml)
table { border: 1px solid black; border-collapse: collapse; } td { border: 1px solid black; padding: 10px;}
Eva <pro>Adam Sejdeme se u stromu... Adam <pro>Eva Tak teda jo...
45/46
XSLT v .NETu ► Třída ►
XslTransform
Load(string fileName) ►
Vyhazuje XsltCompileException
►
Vhodné odladit xslt jinak (browser)
►
Transform(string inFile, string outFile)
►
Mnoho dalších přetížení ►
Pro proudy (XSLT transformace na webovém serveru)
►
XmlResolver (zapouzdření obecného zdroje dat v XML)
46/46
Konec
47/46