Cum sa lucram cu XML in C#?
9XML este un metalimbaj utilizat pentru descrierea datelor. Este un limbaj foarte folositor (alternativ) pentru organizarea datelor.
Unde il putem folosi? La aceasta intrebare exista o multime de raspunsuri dar cel mai simplu este www. Cu ajutorul XML-ului poti crea un music player, un slideshow, un mic blog , RSS etc.
XML este foarte indragit deoarece nu iti ia mult timp pentru a-l invata (doar baza). De ce aceasta usurinta? Pentru ca nu trebuie sa invatati decat cateva reguli : tot ce se deschide la sfarsit se inchide si exista un parinte si fiii. Andrei a mai discutat despre XML pana acum asa ca banuiesc ca nu este foarte nefamiliar.
<?xml version="1.0" encoding="utf-8"?> <limbaje> <!--parintele principal --> <limbaj> <!—parinte pentru nume si autor, dar copil pentru limbaje--> <nume>XML</nume> <autor>W3C</autor> </limbaj> <limbaj> <nume>C++</nume> <autor>Bjarne Stroustrup</autor> </limnaj> </limbaje>
Cam asa arata un document XML in general. Pe prima linie se afla declaratia xml, iar pe urmatoarele linii sunt tagurile definite de utilizator respectand regulile spuse mai sus. Pe langa elementele din exemplu de mai sus intr-un fisier se pot intalni si atribute.
C# ofera programatorilor clase cu care sa lucreze cu XML intr-un mod foarte usor. Eu am sa va prezint doar clasele XmlTextWriter si XmlTextReader.
Pentru a lucra cu aceste clase trebuie sa adaugam in randul directivelor System.Xml.
XmlTextWriter
Clasa XmlTextWriter ofera posibilitatea de a scrie un fisier xml.
.... using System.Xml; ... private void Form1_Load(object sender, EventArgs e) { XmlTextWriter writer = new XmlTextWriter("fisier.xml", null); writer.WriteStartDocument(); writer.WriteStartElement("salut"); writer.WriteStartElement("altceva"); writer.WriteAttributeString("atribut", "aval"); writer.WriteString("valoarea2"); writer.WriteEndElement(); writer.WriteStartElement("buna"); writer.WriteString("aaaaaaaa"); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndDocument(); writer.Close(); }
Constructorul clasei XmlTextWriter are 2 parametrii: numele fisierului xml (cale absoluta sau relativa), parametrul de specificare al codificarii (daca este utf-8 atunci transmitem null).
Pentru declararea declaratiei xml a fisierului folosim metoda WriteStartDocument(). Ca sa respectam regula deschidere-inchidere, la sfarsit, cand terminam cu scrierem folosim metoda WriteEndDocument(). Vazand aceasta explicatie si de listingul de mai sus cred ca v-ati prins de smen.
Pentru scrierea unui elemen folosim :
(XmlTextWriter obw=new XmlTextWriter("nume.xml.",null)) obw.WriteStartElement("numeletagului") // (<numeletagului>) obw.WriteString("valoare") //(<numeletagului>valoare) obw.WriteEndElement() //(<numeletagului>valoare</numeletagului>)
Acest stil de lucru este echivalent cu
obw.WriteElementString("numeletagului","valoare")
In clasa XmlTextWriter mai exista si WriteComment(string comment) (plaseaza un comentariu in fisierul xml <!– comentariu –> ), WriteAttributeString(string name,string value) (adauga un atribut elementului curent , acesta metoda se foloseste cu ajutorul primului mod de a scrie un element intr-un fisier),s.a. La sfarsitul muncii inchidem fluxul cu ajutorul metodei Close() pentru a elibara memoria.
XmlTextReader
Aceasta clasa este folositoare citirii elementelor dintr-un fisier XML. Modul de lucru este asemenea celui de la scriere.
XmlTextReader reader= new XmlTextReader(string name);
Metoda Read() citeste nodurile dintr-un document XML pe rand. Din cauza ca citeste fiecare nod trebuie sa selectam tipul acestuia (element, atribut, text, etc.). Pentru aceasta folosim proprietatea NodeType si enumerarea XmlNodeType care contine urmatorii membrii (usor de tinut minte): Element, Text, Comment, EndElement, Attribute.
while(reader.Read()) { switch(reader.NodeType) { case XmlNodeType.Element: ... } }
XmlDocument
Cel mai simplu mod de manevrare a fisierelor XML este folosirea clasei XmlDocument.
XmlDocument doc=new XmlDocument(); doc.Load("numefisier.xml"); XmlNodeList nod= doc.SelectNodes("parinte/copil"); for(int i=0;i<nod.Counts;i++) { Console.Write(nod.Item(i).SelectSingleNode("numenod").InnetText+"\n"); }
[…] This post was mentioned on Twitter by Andrei Avadanei and Avadanei Andrei, Andrei Avadanei. Andrei Avadanei said: RT @worldIT Cum sa lucram cu XML in C#? http://goo.gl/fb/HMBi #WorldIT […]
Foarte interesant articolul. Dar ai o greseala „si exista un parinti si fii”
Daca ai mai putea insista oleaca pe navigarea prin fisierul xml ar fi superb 😀
Am observat si eu greseala. Imi cer scuze!!!
Andrey, navigarea prin fisierul xml se face ca in exemplul dat de mine la clasa XmlTextReader . (daca nu reusesti, anunta-ma si voi publica un cod sursa cu comentari pentru a vedea la ce ma refer)
Nu ca nu inteleg, ci ca si completare :))
[…] This post was mentioned on Twitter by Bogdan Condurache. Bogdan Condurache said: Cum sa lucram cu XML in C#? – http://b2l.me/k26w6 (via @worldIT) […]
Multumesc frumos,
aveam de imporatat un xml de 300mb si load xml din mysql tinea cam 4 ore..
am folosit metoda clasica cu XmlDocument si acum imi ia 2 minute:D
tx
revin si intreb, nu ai putea defini o clasa pentru fiecare rand din nodul XML si sa faci un foreach (clasa DB in nod) si sa le accesezi mai stilat? am sa incerc si daca reusesc te anunt.
Puteti trata si subiectul LINQ to XML.