Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

XML XDocument LINQ to XML

Hasonló előadás


Az előadások a következő témára: "XML XDocument LINQ to XML"— Előadás másolata:

1 XML XDocument LINQ to XML
Haladó Programozás XML XDocument LINQ to XML OE-NIK HP

2 XML (w3schools.com) XDocument LINQ to XML
Haladó Programozás XML (w3schools.com) XDocument LINQ to XML OE-NIK HP

3 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

4 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

5 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

6 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 "?> <?xml version="1.0" encoding="UTF-8"?>  ERŐSEN JAVASOLT! OE-NIK HP

7 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

8 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 < > & & &apos; " " OE-NIK HP

9 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

10 Dokumentum-deklaráció
XML – Összefoglalás <?xml version="1.0" encoding="ISO "?> <note date=" "> <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

11 XML XDocument LINQ to XML
Haladó Programozás XML XDocument LINQ to XML OE-NIK HP

12 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

13 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

14 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

15 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

16 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

17 XDocument betöltése XDocument inDoc = XDocument.Load("Joe.xml");
XDocument XDoc = XDocument.Load (" <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

18 XML XDocument LINQ to XML
Haladó Programozás XML XDocument LINQ to XML OE-NIK HP

19 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

20 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

21 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 (" 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

22 LINQ to XML XDocument XDoc = XDocument.Load (" 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

23 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 címmel rendelkező dolgozóval egy intézetben dolgozókat! OE-NIK HP

24 Források Fülöp Dávid XLinq prezentációja
Linq to XML in 5 minutes: Access XML data using Linq: Simple XML parsing examples: , XML: Reiter István: C# jegyzet ( , 224. oldal (A könyv az XMLReader/Writer, illetve az XmlDocument használatát mutatja be) OE-NIK HP

25 OE-NIK HP

26 OE-NIK HP


Letölteni ppt "XML XDocument LINQ to XML"

Hasonló előadás


Google Hirdetések