260 likes | 390 Vues
Haladó Programozás. XML XDocument LINQ to XML. Haladó Programozás. XML (w3schools.com) XDocument LINQ to XML. XML. <?xml version="1.0"?> < note > < to > Tove </ to > < from > Jani </ from > < heading > Reminder </ heading > < body > Don't forget me this weekend! </ body >
E N D
Haladó Programozás XML XDocument LINQ to XML Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
Haladó Programozás XML (w3schools.com) XDocument LINQ to XML Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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? Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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! Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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: Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
Haladó Programozás XML XDocument LINQ to XML Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
XElement • A konstruktor flexibilis (params kulcsszó) szinte bármilyen XML létrehozható akár egyetlen konstruktorhívással • var xe = newXElement("ember", "Joe"); <ember>Joe</ember> • var xe2 = newXElement("ember",newXElement("név", "Joe"), newXElement("kor", 25)); <ember> <név>Joe</név> <kor>25</kor> </ember> Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
XAttribute • Konstruktorral:var xe = newXElement("ember", newXAttribute("id", 43984), newXElement("név", "Joe"), newXElement("kor", 25)); • Utólag:var xe2 = newXElement("ember", newXElement("név", "Joe"), newXElement("kor", 25)); xe2.SetAttributeValue("id", 43984); <ember id="43984"> <név>Joe</név> <kor>25</kor> </ember> Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
XDocument mentése XDocument outDoc = newXDocument( newXElement("nép", newXElement("ember", newXAttribute("id", 0), newXElement("név", "Joe"), newXElement("kor", 22)), newXElement("ember", newXAttribute("id", 1), newXElement("név", "Quagmire"), newXElement("kor", 34)))); outDoc.Save("people.xml"); • Egyénre szabható: outDoc.WriteTo(…) + XmlWriter Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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> Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
Haladó Programozás XML XDocument LINQ to XML Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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 selectnew { Regio = g.Key, Atlag = g.Average(y => (y.Min + y.Max) / 2) }; Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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(); Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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) selectnew { 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(); Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
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! Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
Források • Fülöp Dávid XLinq prezentációja • www.windowsclient.net • Marco Russo, Paolo Pialorsi: Programming Microsoft LINQ • 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) Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu
Szabó Zsolt & Fülöp Dávid, Óbudai Egyetem, 2011 szabo.zsolt@nik.uni-obuda.hu