1.oldal.NET és az XML XML alapok Mi ez? Mire jó? Extensible Markup Language(Kiterjeszthető Leíró Nyelv) rövidítése. Arra szolgál, hogy félig strukturált formában írjunk le különböző adatokat. XML dokumentumokról beszélünk, ami egymásba ágyaszott nodeokból áll, ezekhez kapcsolunk attribútumokat. Hasonlít a html-hez, html tag-ekhez. Fastruktúra szerűen néz ki, egymásba ágyazható. - jól formázott XML (pi, node, attribútumok, komment) jól formázott ha a nyító-csukó TAG-ek sorrendej megfelelő, és megfelelően ágyazódnak egymásba Példa: <?xml version="1.0" encoding="utf-8"?> <RootNode> <SubNode attr="akarmi"> <UresNode attrusernode="asdfasd" /> </SubNode> <!-- komment --> </RootNode> <?xml> ezzel kezdődik és verzió, milyen kódolás,... stb. írható Egy gyökér lehet! <nev> jel közé node neve </nev>lezárása node-nek nem akarunk bele tenni plusz nodet: <... /> xmllex.xml néven mentem. Internet Explorer-el megnézem, ha nem jó kiírja. Hiba: pl. node-oknak nyitó záró nem stimmel. Le kell zárni subnodeokat. Komment: <!-- komment szövege --> Szerepe az informatikában XML szabványos! Különböző rendszer különböző rendszerei együtt tudnak működni. pl.: websevice Szolgáltatást lehet publikálni Soap protokollon, ami szabványos XML-en keresztül kommunikál. Server oldalon meghív eljárást adott formátumban egy soap formátumban a saját adatstruktúrájára vissza tudjuk konvertálni. (adat- konv- küld- konvadat) Legtöbb modell: pl. avalonon shell server. Új Office is tudja XMLben menteni szabványosan. Bármely dokumentum leírható. Nodeban lehet node, nodehoz lehet attribútumot rendelni. Ez szöveges, de lehetne binárisan formátumban is. Windows presentation, Vista, XML alapú felület leíró. Bármi leírható XML-ben. További leírás található még az XLM-ről pl.itt: http://ablinux.inf.elte.hu/oradoc9/xmlff.htm
2.oldal Alacsony szintű elérése - XMLDocument (Load, Save) Legyen Személyes/üzleti névjegykártya. Érjük el.netből. UTF-8 ra menteni! Csúnya akármit rak a file elejére. <?xml version="1.0" encoding="utf-8"?> <Cards> <Personal> <Card id="kpocza" name="krisztián Pócza" birthyear="1981" phone="11111" /> <Card id="scsf" name="csaba Seres" birthyear="1982" phone="22222" /> <Card id="xyz" name="xyz" birthyear="1981" phone="44444" /> </Personal> <Business> <Card id="bz" name="zoltán Boncz" birthyear="1982" phone="33333" /> </Business> </Cards> Próbáljuk elérni ezt az XML-t! XMLExample. using System.XML; private static void ShowSingleCard(XmlNode xmlnode) Console.WriteLine("NodeName: 0", xmlnode.name); Console.WriteLine(" Id: 0", xmlnode.attributes["id"].value); Console.WriteLine(" Name: 0", xmlnode.attributes["name"].value); Console.WriteLine(" BirthDate: 0", xmlnode.attributes["birthyear"].value); Másik példa könyv nyilvántartás: sing System; using System.Collections.Generic; using System.Text; using System.Xml; namespace LowLevelXml class Program static void Main(string[] args) XmlDocument books = new XmlDocument(); books.load(@"c:\dotnet\7\konyvek.xml"); Console.WriteLine("de: 0", books.documentelement.name); Console.WriteLine("number of books: 0", books.documentelement.childnodes.count); Console.WriteLine("elso gyerek: 0", books.documentelement.childnodes[0].name); Console.WriteLine("elso gyerek cime: 0", books.documentelement.firstchild.attributes["title"].value); Console.WriteLine("elso gy. inner xml: 0", books.documentelement.firstchild.innerxml); Console.WriteLine("elso gy. outer xml: 0", books.documentelement.firstchild.outerxml);
3.oldal foreach (XmlNode node in books.documentelement.selectnodes("/books/book[@pubyear='2003']")) Console.WriteLine(node.Attributes["title"].Value); foreach (XmlNode node in books.documentelement.selectnodes("//book[@pubyear='2003']")) Console.WriteLine(node.Attributes["title"].Value); XmlElement newbook = books.createelement("book"); newbook.setattribute("title", "asdfasdfg"); XmlAttribute attr = books.createattribute("pubyear"); attr.value = "1234"; newbook.attributes.append(attr); newbook.setattribute("author", "asdfasdf"); books.documentelement.appendchild(newbook); books.save(@"c:\dotnet\7\konyvek2.xml"); Loadnál filenevet adhatunk meg, melyik XML filet akarjuk. Menteni a save metódussal lehet. Adatokat elérni: - SelectNodes és XPath Egy vagy több nod-ot lehet vele kiszelektálni: xmldoc.selectnodes... egy nodelistet ad vissza. Paramétere egy un. Xpath kifejezés lehet. XPath kifejezésekben használható dolgok: (.,.., /, *, @attr, csúcsnév, [felt], // <- tetszőleges szinttel lejjebb ) [felt or felt] [felt and felt] [not(felt)] Xpath_kif Xpath_kif A feltételben tesztelni lehet attribútum értékét vagy létezését -> [@att="..."], [@att] csomópont tartalmát -> [text()="..."] gyermek csomópont tartalmát vagy létezését -> [Csnev="..."], [Csnev] Részletesebb segítség az XPath kifejezésekhez: http://www.zvon.org/xxl/xpathtutorial/general/examples.html Programozási nyelvek fájtáji: - GPL - General Purpose Language(pl: C) - DSL - Domain Specific Language (ilyen XPath) Attribútum elérése "név alapján". Kisbetűre érzékeny. Két per jel egymás után: A//B! Ami A alatt van mindent kiír, ami B típusú. Attribútum elé @ kell!
4.oldal Pl.Adjunk hozzá egy elemet! 1 node nem tartozhat 2 vagy több XML-hez. xmlvmi.createelementhez tarozik Csak! Adjunk attribútumokat is hozzá! xmlelement! Elég hosszú és könnyen elszúrható. private static void LowLevelXml() XmlDocument xmldoc = new XmlDocument(); xmldoc.load(@"c:\dotnet\7\card.xml"); Console.WriteLine("-----------------Personal cards:"); XmlNodeList xmlnodelist = xmldoc.selectnodes("/cards/personal/card"); foreach (XmlNode xmlnode in xmlnodelist) ShowSingleCard(xmlNode); Console.WriteLine("-----------------Every card:"); XmlNodeList xmlnodelist2 = xmldoc.selectnodes("/cards//card"); foreach (XmlNode xmlnode in xmlnodelist2) ShowSingleCard(xmlNode); Console.WriteLine("-----------------1982:"); XmlNodeList xmlnodelist3 = xmldoc.selectnodes("/cards//card[@birthyear=\"1982\"]"); foreach (XmlNode xmlnode in xmlnodelist3) ShowSingleCard(xmlNode); XmlNode businessnode = xmldoc.selectsinglenode("/cards/business"); XmlElement xmlelem = xmldoc.createelement("card"); XmlAttribute idattr = xmldoc.createattribute("id"); idattr.value = "tkt"; xmlelem.attributes.append(idattr); XmlAttribute nameattr = xmldoc.createattribute("name"); nameattr.value = "Katalin Tóth"; xmlelem.attributes.append(nameattr); XmlAttribute birthyearattr = xmldoc.createattribute("birthyear"); birthyearattr.value = "1980"; xmlelem.attributes.append(birthyearattr); XmlAttribute phoneattr = xmldoc.createattribute("phone");
5.oldal phoneattr.value = "555555"; xmlelem.attributes.append(phoneattr); businessnode.appendchild(xmlelem); xmldoc.save(@"c:\dotnet\7\card2.xml"); Element, attribútum runtime létrehozása Szerializáció A fenti módszer alacsony szintű elérést biztosít XML documentumokhoz. Most megnézzük egy magasabb szintű elérést. Osztályok és objektumok XML Documentumba való kiírására is van lehetőség. Osztály serializálása és deserializálása (Serializable attribútum) Mit jelent? Sorosítás. Sorosítás során a memóriában tárolt objektumok és a köztük fennáló hivatkozások által kialakított gráfot egy szekvenciális adatfolyamba helyezzük el. (Deserializásió ennek visszafordítása). Ennek egy speciális eseten amikor XML formátumba kerülnek az adatok a adatfolyamba, ami tipikusan egy fájl. Így az objektumainkat könnyedén kiírhatjuk XML dokumentumba. Osztályt sorosítása: SerExClass [Seriaziable] Csak publikusat lehet (vagy property-n keresztül). Kell default constructor. Sorosít:Geom obj. go= new... usingolni ahova kitoljuk a cuccot Stream writer (szokás mert disposeolható objectum. ) XmlSeria.. (típus, Hogy attribútumba és nem nodeba legyen: Elé írjuk: [XmlAttr] Visszatölteni: using StreamReader Deserialize... [Serializable] public class Coordinate public Coordinate()
6.oldal public Coordinate(int x, int y) this.x = x; this.y = y; [XmlAttribute] public int x; [XmlAttribute] public int y; [Serializable] public class GeomObj public string name; public Coordinate[] edges; private static void SerializeEx() GeomObj go = new GeomObj(); go.name = "line"; go.edges = new Coordinate[2]; go.edges[0] = new Coordinate(1, 1); go.edges[1] = new Coordinate(2, 3); XmlSerializer ser = new XmlSerializer(typeof(GeomObj)); Using(StreamWriter sw =new StreamWriter("c:\\dotnet\\7\\ser.xml")) ser.serialize(sw, go); using (StreamReader sr = new StreamReader("c:\\dotnet\\7\\ser.xml")) GeomObj go2 = (GeomObj)ser.Deserialize(sr); XML séma definíció
7.oldal Az XML Schema egy újabb keletű XML séma nyelv, amit a W3Ca DTD utódaként definiáltak. Ez egy szabványos leíró nyelv. XML kinézetét le tudjuk írni. Erre a sémára illeszkedik e az XML. A nyelvet szokták XSD-nek (XML Schema Definition) is hívni. A könyveket nyilvántartását leíró XML documentum sémája a következő: <xs:schema id="bookschema" targetnamespace="edu://elte.net/bookschema.xsd" elementformdefault="qualified" xmlns="edu://elte.net/bookschema.xsd" xmlns:mstns="edu://elte.net/bookschema.xsd" xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:complextype name="book"> <xs:sequence /> <xs:attribute name="title" type="xs:string" /> <xs:attribute name="pubyear" type="xs:integer" /> <xs:attribute name="author" type="xs:string" /> </xs:complextype> <xs:complextype name="booksroot"> <xs:sequence> <xs:element name="books" type="book" minoccurs="1" maxoccurs="1000" /> </xs:sequence> </xs:complextype> <xs:element name="booksr" type="booksroot"> </xs:element> </xs:schema> Lehet.Netes osztályt készíteni és le lehet generálni ezeket az osztályokat egy ingyenes tool segítségével, amely a.net Framework része. Project menü/ Add new item / XML Schema. (Létező XSD megnyitható fájl menüből) (Rendes fejlesztő szívesen használ toolokat, csak akkor ír kódot, ha muszáj!) Ezzel könnyedén tudunk XML sémákat szerkeszteni. Mindenképp kell egy gyökér elem(ez most.booksroot). Ez tartalmazza a könyv típusú elemeket. Ennek a könyvtípusnak a leírásában pedig attriútumok vannak definiálva minden egyes könyvhöz. Ennek megfelelően tudunk létehozni element, complextype objektumokat és összekapcsolava őket meghatározhatjuk a kívánt szerkezetet.
8.oldal xsd.exe használata where xsd.exe -> hol van path> xsd /c XsdGeomObj.xsd Automatikusan generálja a kódot! Ugyanúgy serializál, deserializás Xsd \c \n Megadható namespace ami hasznos lehet. targetnamespace="edu://elte.net/bookschema.xsd"
9.oldal app.config Konfiguráció kezelés. Van alkalmazásom és kell application konfig file. New item / App.ConfigFile Lefordítom és van: XmlExample.exe config <?xml version="1.0" encoding="utf-8"?> <configuration> </configuration> - appsettings Legegyszerűbb! <add key.. value..> using System.Configuration Configuration settings.appsettings Bele lehetne indexelni, de mi kulcs szerint akarjuk elérni. És innentől állítható lesz. Bonyolultabb konfigurációra példa a média lejátszós példa - saját section. pl. MediaPlayer Olyan szimuláció, ami csak példa saját konfigurációs bejegyzések ír/olvas-ra és a Osztályt betölt/futtat-ra. Code acces security csak onnan olvashat ahonnan zenét játszik mást nem piszkálhat. config section type.netben= neve és assembly plugin- nem tudom miket játszik majd le. Kell: IConfSesson IF-ből kell származni. Beolvassuk Hash táblába, ebből lesz plug_in options és a kulcs a "name" mező. 1. x.xml lejátsza (számol) 2. x.xml2 nem játsza le 3. exception, mert butaságot akar csinálni. LoadPlugin Nem példányosítottam direktbe! Ez magától tudja. ht-be visszaadja.(mikor Lekérem a konfigurációt) Példány típusból nem sikerül, akkor azt a plug int nem tudom használni. Azok érdekelnek, akik IDecoderBase-t impl. pl: Frame lekérdezés. Ezeket a szolgáltatásokat nyújtják. Példányt létre hoz, vmio.utvonalon van, és lejátsza. Absztrakt/ Relatív elérési út. Aktuális /megadott könyvtár. Milyen dekóder tartozik hozzá? ext- hez rendelhető e? Akkor abból olvashatok, ahol lejátssza a filet. get_vmi = Property get-je RunableDecoder- ne kelljen alacsony szintű művelet a másik kódba.
10.oldal.NET és az XML... 1 XML alapok... 1 Alacsony szintű elérése... 2 Szerializáció... 5 app.config... 9