XML XDocument LINQ to XML Haladó Programozás XML XDocument LINQ to XML OE-NIK HP
XML (w3schools.com) XDocument LINQ to XML Haladó Programozás XML (w3schools.com) XDocument LINQ to XML OE-NIK HP
XML <?xml version="1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> Olyan, mint a HTML? OE-NIK HP
HTML vs XML HTML: „tag”-ek sorozata: <html> , <head>, <body> … Mindegyik speciális jelentéssel bír, előre definiáltak (HTML szabvány) HTML: laza szabályok, nem kell tökéletesnek lenni egy dokumentumnak (lezárás, kis- és nagybetűk, egymásba ágyazás) HTML: Eredetileg adat és megjelenítés definiálására lett kitalálva (bár HTML+CSS elv szerint az a jó, ha csak adatot definiál) XML: saját tagek használhatóak, a tárolni kívánt adat egyediségének megfelelően XML: SZIGORÚ szabályok, a dokumentumnak helyesnek KELL lennie (ha nem az, a parsernek csak azt kell jeleznie, hogy „error”) XML: Adatok definiálására való, nem ír le semmilyen folyamatot XHTML: a kettő keveréke HTML tagek, XML szigorúságával OE-NIK HP
XML felhasználása Tetszőleges adat szöveges leírása, és így továbbításra alkalmas forma felépítése Programozási nyelvtől független adatleírás és -továbbítás Platformfüggetlen adattovábbítás Számos internetes „nyelv” leíró eszköze: XHTML WSDL WML (WAP) RSS Konfigurációs állományok, pl. a Visual Studioban mindenhol OE-NIK HP
XML struktúra <?xml version="1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> Első sor: kötelező formátum specifikáció Kiegészíthető karakterkódolással: <?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="UTF-8"?> ERŐSEN JAVASOLT! OE-NIK HP
XML struktúra Kötelezően kell lennie egy gyökérelemnek, ami az egész dokumentumot közrefogja (ebben az esetben: a note elem) Mindegyik elem alá lehet rendelni al-elemeket Mindegyik elemnek lehet szöveges tartalma és attribútuma, amely az adott elemhez ad meg extra tulajdonságokat (metadata) Bár szabály nincs rá, de a józan ész elvei szerint kell használni az attribútumokat és a gyerekelemeket. Ez a megoldás szintaktikailag helyes lenne, de nem ésszerű: <note day="10" month="01" year="2008" to="Tove" from="Jani" heading="Reminder" body="Don't forget me this weekend!"> </note> Javaslat: attribútum csak kivételes esetben, legtöbbször csak az id="valami" , mert ez alapján lehetséges az elemek azonosítása OE-NIK HP
XML szabályok Minden tag lezárása kötelező (<tag></tag> vagy <tag />) A kis- és nagybetűk különbözőek Az attribútumok jelzésénél kötelező az idézőjel vagy az aposztróf Az egymásba ágyazás lezárásainak megfelelő sorrendben kell lenniük: Rosszul formázott: <a><b></a></b> Jól formázott: <a><b></b></a> Speciális karakterek helyett entity-ket használunk: Karakter Entity < > & & ‘ ' " " OE-NIK HP
XML szabályok <!-- megjegyzés --> A szöveges tartalmakban a szóköz karakterek megmaradnak Sorvégjel: linux/unix szerű \n (\r nem kell, de a legtöbbször nem gond) Tag-névben lehet szám és betű is, de többnyire csak az angol ABC betűit használjuk Lehetőleg legyen rövid Space nem használható, inkább _ Pont, kötőjel, kettőspont nem javasolt, inkább _ Szám nem lehet a név elején DTD/Schema készíthető: „well formed” vs „valid” Az XML kiegészíthető: új tag bevezetése nem teszi tönkre az eddig használt feldolgozó programokat DTD: saját formátuma van. Leírja, hogy milyen tag-ek léteznek, melyik milyen tag-be ágyazható, és melyiknek milyen attribútuma engedélyezett. Schema: XML elveket követő leírási formátum, ugyanazok az információk vannak benne, mint a DTD-ben „well formed” = jó xml, nincs benne szintaktikai hiba „valid” = a DTD-hez illeszkedő OE-NIK HP
Dokumentum-deklaráció XML – Összefoglalás <?xml version="1.0" encoding="ISO-8859-1"?> <note date="2010.04.14"> <from>Joe</from> <to>Bill</to> <heading>Hibajelentés</heading> <body>Elszúrtad!</body> </note> Dokumentum-deklaráció Gyökérelem Elem Záróelem Attribútum OE-NIK HP
XML XDocument LINQ to XML Haladó Programozás XML XDocument LINQ to XML OE-NIK HP
XML + .NET XmlReader, XmlWriter Gyorsak, kevés memóriát fogyasztanak Csak előrefelé tudnak dolgozni Bonyolult az összetett xml-ek megírása Az xml-transzformáció borzasztó tud lenni (node csere, node változtatás, etc) XmlDocument, XmlNode, XmlElement, Xml* Lassú, sokat fogyaszt (a memóriában felépíti a teljes dokumentum fáját) Ezzel sem feltétlenül egyszerűek az algoritmusok Előnyös, ha transzformálni akarunk OE-NIK HP
X* osztályok Cél: Gyors Letisztult XML eszközök támogatása (XQuery, XSLT) XPath helyettesítése XDocument, XElement, XAttribute, XDeclaration, X* Átláthatóbban írhatunk XML-t C#-ban (és más .NET-nyelveken) System.Xml.Linq névtér Automatikusan stringgé alakulnak (tagekkel együtt!) A tényleges tartalom (Value) feldolgozásához kasztolni kell OE-NIK HP
XElement A konstruktor flexibilis (params kulcsszó) szinte bármilyen XML létrehozható akár egyetlen konstruktorhívással var xe = new XElement("ember", "Joe"); <ember>Joe</ember> var xe2 = new XElement("ember", new XElement("név", "Joe"), new XElement("kor", 25)); <ember> <név>Joe</név> <kor>25</kor> </ember> Params el kell magyarázni OE-NIK HP
XAttribute Konstruktorral: var xe = new XElement("ember", new XAttribute("id", 43984), new XElement("név", "Joe"), new XElement("kor", 25)); Utólag: var xe2 = new XElement("ember", xe2.SetAttributeValue("id", 43984); <ember id="43984"> <név>Joe</név> <kor>25</kor> </ember> OE-NIK HP
XDocument mentése XDocument outDoc = new XDocument( new XElement("nép", new XElement("ember", new XAttribute("id", 0), new XElement("név", "Joe"), new XElement("kor", 22)), new XAttribute("id", 1), new XElement("név", "Quagmire"), new XElement("kor", 34)))); outDoc.Save("people.xml"); Egyénre szabható: outDoc.WriteTo(…) + XmlWriter OE-NIK HP
XDocument betöltése XDocument inDoc = XDocument.Load("Joe.xml"); XDocument XDoc = XDocument.Load ("http://nik.uni-obuda.hu/workers.php"); <worker id="[person_id]"> <name>[person_name]</name> <dept>[person_dept]</dept> <room>[person_room]</room> <phone>[person_phone]</phone> <mail>[person_mail]</mail> <web>[person_web_hu]</web> <number>[random]</number> </worker> A „random” értéke pszeudo-random 0-255: a név bináris MD5-jének második byteja decimálisan OE-NIK HP
XML XDocument LINQ to XML Haladó Programozás XML XDocument LINQ to XML OE-NIK HP
LINQ ismétlés – Használható operátorok Rendezés: OrderBy – tetszőleges sorrend, Reverse – sorrend megfordítása Halmaz-kezelés: Concat – egymás után másolás, Contains – elem meglétének vizsgálata, Distinct – ismétlések szűrése, Intersect – halmazelméleti metszet, Union – halmazelméleti únió, Except – Halmazelméleti különbség Szűrés: Where „Számolás” („Aggregate methods”, aggregáló eljárások): Average – átlag, Count – darabszám, Max – Maximum, Min – Minimum, Sum – Összeg Csoportosítás: GroupBy – valamilyen közös tulajdonság szerint lehet csoportosítani a tagokat OE-NIK HP
LINQ ismétlés – Használat Lambda kifejezések, var típus, objektum inicializáló, névtelen típusok int num = jelzesek.Where(x => x.Jelleg == jelleg_tipus.Viharos).Select(x => x.Regio).Distinct().Count(); var grp = from x in jelzesek group x by x.Regio into g select new { Regio = g.Key, Atlag = g.Average(y => (y.Min + y.Max) / 2) }; OE-NIK HP
LINQ to XML Valamivel lassabb, mint az XmlReader String adatokkal dolgozunk – mindig konvertálni kell a valódi típusra (typecasting)! XDocument XDoc = XDocument.Load ("http://nik.uni-obuda.hu/workers.php"); var q = from x in XDoc.Root.Descendants("worker") select x; foreach (var akt in q) { Console.WriteLine(akt.ToString()); } Console.ReadLine(); Descendants() paraméterezés nélkül minden gyermekelemen (a gyermekelem gyermekelemein is!) végigmegy OE-NIK HP
LINQ to XML XDocument XDoc = XDocument.Load ("http://nik.uni-obuda.hu/workers.php"); var q = from x in XDoc.Root.Descendants("worker") where ((int)x.Element("number") > 150) && ((int)x.Attribute("id") % 2 ==1) select new { id=(int)x.Attribute("id"), name=(string)x.Element("name"), number=(int)x.Element("number") }; foreach (var akt in q) { Console.WriteLine(akt.ToString()); } Console.ReadLine(); Hívjuk fel a figyelmet a típuskonverziókra! X.Element() és X.Attribute() visszatérési értékét mindig konvertálni kell OE-NIK HP
Feladatok Implementáljuk a prezentációban látható funkciókat: összes rekord; páratlan ID-jű és 150-nél nagyobb számmal rendelkezők Szakcsoportonként tudni szeretnénk a dolgozók darabszámát. A listát rendezzük szakcsoport szerinti sorrendbe! Határozzuk meg szintenként a dolgozók darabszámát és az átlagos számértéküket! Határozzuk meg a legnagyobb intézetet! Listázzuk ki a leghosszabb e-mail címmel rendelkező dolgozóval egy intézetben dolgozókat! OE-NIK HP
Források Fülöp Dávid XLinq prezentációja Linq to XML in 5 minutes: http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx Access XML data using Linq: http://www.techrepublic.com/blog/programming-and-development/access-xml-data-using-linq-to-xml/594 Simple XML parsing examples: http://omegacoder.com/?p=254 , http://gnaresh.wordpress.com/2010/04/08/linq-using-xdocument/ XML: Reiter István: C# jegyzet (http://devportal.hu/content/CSharpjegyzet.aspx) , 224. oldal (A könyv az XMLReader/Writer, illetve az XmlDocument használatát mutatja be) OE-NIK HP
OE-NIK HP
OE-NIK HP