Acest articol reprezinta un prim articol in care voi vorbi despre manipularea documentelor XML folosind c#. O sa incerc pe parcurs sa traduc si in vb.Net codul c# folosit, insa nu cred ca intr-o prima etapa. Va fi o serie de articole in care voi incerca sa exemplific lucrul cu clase din namespaceul System.Xml. Voi incepe prin notiuni fundamentale, apoi, treptat, voi descrie cateva apicatii practice ale lucrului cu XML.
Voi presupune ca cel care citeste acest articol stie ce inseamna XML si e capabil sa scrie un document XML valid (fara greseli).
Sa incepem cu ce-i mai simplu: citirea unui document XML si crearea unui obiect de tip XmlDocument (aflat in namespace-ul System.Xml):
using System; using System.Xml; namespace zeltera.xmlTutorials { class Program { static void Main(string[] args) { string strXml = @"<?xml version=""1.0"" encoding=""ISO-8859-1""?> <bookstore> <book> <title lang=""en"">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore> "; XmlDocument xml = new XmlDocument(); xml.LoadXml(strXml); Console.WriteLine(xml.InnerXml); } } }
Acest prim exemplu foloseste un cod xml luat de pe w3school, din tutorialul de xPath.
Ce face acest prim program? Creaza un obiect de tip XmlDocument dintr-un string reprezentand un cod Xml, apoi il afiseaza in fereastra programului. Nefolositor, deocamdata, insa asta e doar incaputul.
Am preferat sa folosesc codul Xml inclus in programul c# (si nu intr-un fisier extern) pentru a simplifica munca celui care citeste si incearca aceste exemple – nu mai trebuie creat inca un fisier.
Care ar putea fi operatiile pe care cineva le-ar putea folosi pe un fisier Xml? Dupa incarcarea lui, cred ca operatia urmatoare ar fi citirea anumitor noduri. In execmplul urmator voi exemplifica cum se pot selecta nodurile documentului si afisa cateva informatii despre ele.
Am mai introdus cateva noduri in xml-ul folosit ca exemplu (numale cartlor sunt fictive).
using System; using System.Xml; namespace zeltera.xmlTutorials { class Program { static void Main(string[] args) { string strXml = @"<?xml version=""1.0"" encoding=""ISO-8859-1""?> <bookstore> <book> <title lang=""en"">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book> <title lang=""eng"">Learning XML</title> <price>39.95</price> </book> <book> <title lang=""eng"">Learning c#</title> <price>49.39</price> </book> <book> <title lang=""eng"">asp.Net in 24 hours</title> <price>19.99</price> </book> </bookstore> "; XmlDocument xml = new XmlDocument(); xml.LoadXml(strXml); //avem un obiect XmlDocument care contine XML-ul cu care lucrez //selectez toate nodurile book XmlNodeList books = xml.SelectNodes("//book"); Console.WriteLine("Carti gasite: "+ books.Count); //afisez cate carti (noduri book) am gasit Console.WriteLine("----------------------------"); foreach (XmlNode book in books) { XmlNode title = book.SelectSingleNode("title"); //selectez toate nodurile title din nodul book if(title!=null) //e important, cand selectez un nod, sa verific daca rezultatul e diferit de null Console.WriteLine(title.InnerText); else Console.WriteLine("Carte fara titlu."); } } } }
Asa cum se vede, programul afiseaza toate numele cartilor, asa cum apar ele in Xml.
In contrinuare voi complica un pic lucrurile, in sensul ca voi citi si atributul lang al nodului title, pe care il voi afisa in continuarea numelui carti. Acum voi afisa un string de forma nume_carte (limba), daca atributul lang este definit, altfel voi afisa, ca si in exemplul anterior, numai numele cartii.
using System; using System.Xml; namespace zeltera.xmlTutorials { class Program { static void Main(string[] args) { string strXml = @"<?xml version=""1.0"" encoding=""ISO-8859-1""?> <bookstore> <book> <title lang=""en"">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book> <title lang=""ro"">XML pe intelesul tuturor</title> <price>39.95</price> </book> <book> <title lang=""en"">Learning XML</title> <price>39.95</price> </book> <book> <title lang=""ro"">c# pentru incepatori</title> <price>39.95</price> </book> <book> <title lang=""en"">Learning c#</title> <price>49.39</price> </book> <book> <title lang=""en"">asp.Net in 24 hours</title> <price>19.99</price> </book> <book> <title>asp.Net in 24 ore</title> <price>19.99</price> </book> </bookstore> "; XmlDocument xml = new XmlDocument(); xml.LoadXml(strXml); //avem un obiect XmlDocument care contine XML-ul cu care lucrez //selectez toate nodurile book XmlNodeList books = xml.SelectNodes("//book"); Console.WriteLine("Carti gasite: "+ books.Count); //afisez cate carti (noduri book) am gasit Console.WriteLine("----------------------------"); foreach (XmlNode book in books) { XmlNode title = book.SelectSingleNode("title"); //selectez toate nodurile title din nodul book if (title != null) //e important, cand selectez un nod, sa verific daca rezultatul e diferit de null { XmlAttribute lang = title.Attributes["lang"]; string bookLanguage = ""; if (lang != null && lang.Value != string.Empty) bookLanguage = string.Format("({0})", lang.Value); Console.WriteLine(string.Format("{0}\t{1}", title.InnerText, bookLanguage)); } } } } }
Si, asa cum spuneam, afisata in fereastra unde rulez aplicatia, apare lista de carti, si limba in care este scrisa. De remarcat, ultimul nod nu are definit atributul lang, asadar pentru ultima carte nu este afisat acest atribut.
Un ultim exemplu din acest prim articol este o completare la exemplele anterioare si are ca scop afisarea tuturor detaliilor cartilor descrise in xml. Pentru fiecare carte se va afisa ceva de tipul:
nume_carte (lang) costa pret RON
using System; using System.Xml; namespace zeltera.xmlTutorials { class Program { static void Main(string[] args) { string strXml = @"<?xml version=""1.0"" encoding=""ISO-8859-1""?> <bookstore> <book> <title lang=""en"">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book> <title lang=""ro"">XML pe intelesul tuturor</title> <price>39.95</price> </book> <book> <title lang=""en"">Learning XML</title> <price>39.95</price> </book> <book> <title lang=""ro"">c# pentru incepatori</title> <price>39.95</price> </book> <book> <title lang=""en"">Learning c#</title> <price>49.39</price> </book> <book> <title lang=""en"">asp.Net in 24 hours</title> <price>19.99</price> </book> <book> <title>asp.Net in 24 ore</title> <price>19.99</price> </book> </bookstore> "; XmlDocument xml = new XmlDocument(); xml.LoadXml(strXml); //avem un obiect XmlDocument care contine XML-ul cu care lucrez //selectez toate nodurile book XmlNodeList books = xml.SelectNodes("//book"); Console.WriteLine("Carti gasite: "+ books.Count); //afisez cate carti (noduri book) am gasit Console.WriteLine("----------------------------"); foreach (XmlNode book in books) { XmlNode title = book.SelectSingleNode("title"); //selectez toate nodurile title din nodul book XmlNode price = book.SelectSingleNode("price"); //selectez nodul care contine pretul if (title != null) //e important, cand selectez un nod, sa verific daca rezultatul e diferit de null { XmlAttribute lang = title.Attributes["lang"]; string bookLanguage = ""; if (lang != null && lang.Value != string.Empty) bookLanguage = string.Format("({0})", lang.Value); Console.WriteLine(string.Format("{0}\t{1} costa {2} RON", title.InnerText, bookLanguage, price.InnerText)); } } } } }
Care va afisa:
Carti gasite: 7 ---------------------------- Harry Potter (en) costa 29.99 RON XML pe intelesul tuturor (ro) costa 39.95 RON Learning XML (en) costa 39.95 RON c# pentru incepatori (ro) costa 39.95 RON Learning c# (en) costa 49.39 RON asp.Net in 24 hours (en) costa 19.99 RON asp.Net in 24 ore costa 19.99 RON
Inchei acest prim articol aici, urmand sa prezint detalii din ce in ce mai avansate despre lucrul cu fisierele Xml. In articolul urmator voi exemplifica crearea unui document Xml (si salvarea lui pe disk) 100% programatic.
Vanda says:
Buna,
Am si eu o problema in lucrul cu XML-urile. Am o secventa de cod care imi citeste nodurile unul xml si in functie de numarul lor, imi creaza o serie de butoane. Ideea este ca pe orice buton as da click, el ramane cu numele ultimului nod. Cum as putea lucra cu el? Pentru o intelegere mai clara atasaz si codul:
private void readXml() { // Load the file doc.Load(path); clientList = doc.GetElementsByTagName("Client"); foreach (XmlNode node in clientList) { clientElement = (XmlElement)node; // Visit each title for (int i = 1; i <= node.ChildNodes.Count; i++) { loadClient(clientElement.GetElementsByTagName("Name")[i-1].InnerText.ToString(), i); } } } private void loadClient(string client, int i) { int x = 30; int y = 15; btnClient = new System.Windows.Forms.Button(); this.btnClient = new System.Windows.Forms.Button(); this.btnClient.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular); this.btnClient.Location = new System.Drawing.Point(x + 10, y + i * 30); this.btnClient.Name = "btnClient_"+i; this.btnClient.TabIndex = i; this.btnClient.Size = new System.Drawing.Size(100, 25); this.btnClient.Text = client; this.btnClient.Show(); this.Controls.Add(btnClient); this.btnClient.Click += new System.EventHandler(this.btnClient_Click); }zeltera says:
De obicei nu rezolv probleme pe blog, pentru a intreba intrebari de tipul celei postate de tine exista forumuri. Un forum foarte bun este programare.org – ti-l recomand.
Revenind la problema ta: Ai uitat sa postezi codul metodei btnClient_Click. Nu inteleg prea bine intrebarea. La ce te referi cand zici:
maria claudia says:
Buna,
Trebuie sa fac citirea dintr-un XML si sa afisez de acolo doar cuvintele si mie imi afiseaza doar si nu imi afiseaza si valoare nodului.
Va atasez mai jos codul:
XmlTextReader reader = new XmlTextReader(“C:\\Users\\Claudia\\Desktop\\licenta\\train_corpus_augusto.xml”);
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
Console.Write(“”);
break;
case XmlNodeType.Text: //Display the text in each element.
Console.WriteLine(reader.Value);
break;
case XmlNodeType.EndElement: //Display the end of the element.
Console.Write(“”);
break;
-si XML-ul arata asa:
maria claudia says:
XML-ul:
maria claudia says:
//////
XML-ul:
////