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í jazyk podobně jako HTML Popisuje obsah nikoliv formu Tagy 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 <zpráva> <od>eva</od> <pro>adam</pro> <text>sejdeme se u stromu...</text> </zpráva> 4/46
K čemu použít XML? K výměně dat XML může být použito k výměně dat mezi nekompatibilními systémy K ukládání dat XML ukládá do člověkem čitelného textového souboru strukturovaná data K 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 <?xml version= 1.0 encoding= ISO- 8859-2?> <zpráva> <od>eva</od> <pro>adam</pro> <text>sejdeme se u stromu...</text> </zpráva> 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<br> řádka 2<br> XML tagy jsou case sensitive Ne jako u HTML <B>tučný text</b> 8/46
XML syntax XML elementy musí být správně vhnízďovány Ne jako u HTML <b><i>tučně a italikou</b></i> XML dokument musí obsahovat právě jeden kořenový element Příklad <kořen> <dítě> </dítě> </kořen> <!-- konec XML --> 9/46
XML syntax XML atributy musí být vždy uzavřeny v apostrofech či uvozovkách Ne jako u HTML <table width=50> Bílé znaky v XML dokumentu jsou zachovány Ne jako u HTML toto je 1 mezera Komentáře jsou stejné jako u html <!-- komentář --> 10/46
XML elementy Elementy jsou rozšiřitelné Příklad <zpráva> <od>eva</od> <pro>adam</pro> <datum>7. den</datum> <text>sejdeme se u stromu...</text> </zpráva> Způsobí 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 mohou obsahovat atributy Atribut je dvojice název, hodnota Příklad v HTML <a href= index.html >Domů</a> Obecně se atributy používají pro infromace stojící mimo data Příklad <obrázek typ= gif >adam.gif</obrázek> 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 lze nahradit elementy Proč 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é <zpráva od= Eva pro= Adam datum= 7. den text= Sejdeme se u stromu... /> 17/46
XML validace Well-formed XML Dokument má validní syntax <?xml version= 1.0 encoding= ISO-8859-2?> <zprávy> <zpráva> <od>eva</od> <pro>adam</pro> <datum>7. den</datum> <text>sejdeme se u stromu...</text> </zpráva> <zpráva> <od>adam</od> <pro>eva</pro> <datum>bez data</datum> <text>tak teda jo...</text> </zpráva> </zprávy> 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 2005-03-11) Rozšiřitelné 20/46
XML schema Příklad <?xml version="1.0"?> <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"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema> 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 Object Model Standard 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 jednotný přístup ke čtení i zápisu XML 25/46
DOM v.netu Namespace System.Xml Třída 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 <zprávy> <zpráva> <od>eva</od> <pro>adam</pro> zprávy </zpráva> <zpráva> <od>adam</od> <pro>eva</pro> </zpráva> ParentNode zpráva NextSibling zpráva </zprávy> ChildNodes FirstChild LastChild od pro od pro 28/46
DOM v.netu Třída XmlNode string Name 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("<?xml version='1.0' encoding='windows- 1250'?><zprávy></zprávy>"); 32/46
SAX Simple API for XML Není 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 připojí instanci ke XML souboru a otevře ho 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 převádět XML do jiných formátů (HTML,...) Standard W3C XSL popisuje jakým způsobem má XML vypadat XSL je XML <?xml version="1.0"?> <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"> </xsl:template> Uvnitř šablony je vždy některý XML uzel aktivní <xsl:value-of select= path > Vypíše obsah značky <xsl:for-each select= path > </xsl:foreach> Iteruje výsledkem XPath cesty <xsl:apply-templates select= path /> 43/46
XSLT Příklad (zpravy.xsl) <?xml version="1.0" encoding="windows-1250"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/"> <html><head> <link rel="stylesheet" type="text/css" href="zpravy.css" /> </head> <body> <table> <tr><th>od</th><th>pro</th><th>text</th> </tr> <xsl:for-each select="zprávy"> <xsl:apply-templates select="zpráva"/> </xsl:for-each> </table> </body></html> </xsl:template> <xsl:template match = "zpráva"> <tr> <td><xsl:value-of select="od"/></td> <td><xsl:value-of select="pro"/></td> <td><xsl:value-of select="text"/></td> </tr> </xsl:template> </xsl:stylesheet> 44/46
XSLT Příklad (zpravy.css) table { border: 1px solid black; border-collapse: collapse; } td { border: 1px solid black; padding: 10px;} Příklad (zpravy.xml) <?xml version="1.0" encoding="windows-1250"?> <?xml-stylesheet type="text/xsl" href="zpravy.xsl"?> <zprávy> <zpráva> <od>eva</od> <pro>adam</pro> <text>sejdeme se u stromu...</text> </zpráva> <zpráva> <od>adam</od> <pro>eva</pro> <text>tak teda jo...</text> </zpráva> </zprávy> 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