Jazyk C# (seminář 8) Pavel Procházka KMI 12. listopadu 2014
Na co je dobré XML? Deklarativní jazyk reprezentující čitelně data Snadná práce s konfiguračními soubory a ukládání do souboru Human readeble přístup k přečtení není potřeba počítač Strukturovaná rekurzivní podoba n-ární strom Široké použití na webu v příbuzném HTML formátu Časté využití ve webových aplikacích Nevýhodou je velké plýtvání znaky a nejednoznačnost použití atributů a elementů Je to pomalejší a ukecanější, než JSON Možnost validace dat (narozdíl od JSON)
Syntaxe XML Pěkně shrnuto je to tady http://www.w3schools.com/xml/default.asp Obvykle začíná XML dokument hlavičkou určující encoding, typicky <?xml version="1.0" encoding="utf-8"?> Obvykle pák následují data Klíče k datům (elementy) se zapisují do zobáčků <element_name> Element se uzavírá <element_name/> Elementů může být více v globálním prostředí Každý element musí být uzavřen v korektním pořadí Každý element může obsahovat další elementy nebo text Každý element může obsahovat atribut <book moje_id="0xdead">babicka</book> Klíče musí být v uvozovkách
Příklad XML souboru <?xml version="1.0" encoding="utf-8"?> <note> <to> Tove</to> <from>jani</from> <heading>reminder</heading> <body>don t forget me this weekend!</body> </note>
Práce s XML v C# čtení Namespace System.Xml; Potřeba doplnit referenci v některých IDE Budeme potřebovat třídu XmlReader umí číst XML po prvcích K inicializaci slouží XmlReader.Create() metoda je statická!, očekává URI + další přetížení Sekvenční čtení XML zajišt uje metoda Read špatně se takto čtou/detekují zanořená data Metoda IsStartElement zjišt uje, zda je to top-level prvek (jeho rodič je root) Enum XmlNodeType rozlišuje, co zrovna bylo přečteno, možnosti jsou Attribute, Element,Element, Text, EndElement a další (méně důležité)
Příklad XML souboru... <Cube> <Cube time= 2014-11-12 > <Cube currency= USD rate= 1.2467 /> <Cube currency= JPY rate= 143.63 /> <Cube currency= BGN rate= 1.9558 /> <Cube currency= CZK rate= 27.603 /> <Cube currency= DKK rate= 7.4416 /> <Cube currency= GBP rate= 0.78800 /> <Cube currency= HUF rate= 307.36 /> <Cube currency= LTL rate= 3.4528 /> <Cube currency= PLN rate= 4.2192 />... </Cube> </Cube>
Čtení XML XmlReader xmlreader = XmlReader.Create("my_file.xml"); while(xmlreader.read()) { if((xmlreader.nodetype == XmlNodeType.Element) && (xmlreader.name == "Cube")) { if(xmlreader.hasattributes) Console.WriteLine(xmlReader.GetAttribute("currency") ": " + xmlreader.getattribute("rate")); } }
Zápis souborů XML Triviální možnost sestavit programově XML kód Třída XmlWriterSettings nastavuje vlastnosti výstupu typicky indentaci, tabulátory apod. Třída XmlWriter zapisuje do URI, streamu apod. instance se tvoří pomocí XmlWriter.Create(string URI, XmlWriterSettings s); Metoda WriteStartElement(string name) zakládá element name Metoda WriteEndElement() uzavírá příslušný element (automaticky) WriteStartAtribute( string key ) vkládá do elementu atribut key WriteEndAtribute() uzavírá atribut do uvozovek WriteString( string s ) zapisuje řetězec s (i do atributu)
Příklad zápisu XmlWriterSettings settings = new XmlWriterSettings (); settings.indent = true; settings.omitxmldeclaration = false; XmlWriter writer = XmlWriter.Create (Console.Out, setting writer.writestartelement ("book"); writer.writestartelement ("author"); writer.writestartattribute ("born"); writer.writestring ("now"); writer.writeendattribute (); writer.writestring ("Somebody"); writer.writeendelement (); writer.writestartelement ("title"); writer.writestring ("Pride And Prejudice"); writer.writeendelement (); writer.writeendelement (); writer.close ();
Výsledek <?xml version="1.0" encoding="utf-8"?> <book> <author born="18-10-1977">somebody</author> <title>pride And Prejudice</title> </book>
Další možnosti práce s XML v C# To, co jsme právě viděli je asi nejméně inteligentní práce s XML, co v C# existuje Existují příjmnější objekty z namespace System.Xml.Linq Problém je ten, že Linq je vpodstatě další jazyk v jazyku má vlastní syntaxi, která neodpovídá C#! Doporučuji se podívat sem http://msdn.microsoft.com/cs-cz/library/system. xml.linq.xdocument(v=vs.110).aspx Vlastní dotazovací jazyk XPath Všechny možnosti práce s XML jsou pěkně shrnuty zde http://stackoverflow.com/questions/220867/ how-to-deal-with-xml-in-c-sharp
Krátký úvod do JSONu XML soubory Hlavní způsob reprezentace dat na webu Extrémně jednoduchá syntaxe i sémantika Málo nadbytečných znaků při zachování stejné síly jako XML Rozparzování přímo do n-árního stromu
Implementace pro C# Implementace od Microsoftu ne příliš povedená http: //msdn.microsoft.com/en-us/library/hh674188.aspx Opensource implementace http://james.newtonking.com/json Opensource implementace je součástí balíku Mono
A ted vy Udělejte grafický nástroj na přepočet měny podle aktuálního kurzu, ten je uložen na adrese www.ecb.europa.eu/stats/ eurofxref/eurofxref-daily.xml