Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Programare c# | Lucrul cu XML in c#

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.

Category: Uncategorized
  • 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 &lt;= 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);
            }
    September 22, 2010 at 8:48 pm
    • 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:

      Ideea este ca pe orice buton as da click, el ramane cu numele ultimului nod. Cum as putea lucra cu el?

      September 22, 2010 at 9:41 pm
  • 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:

    March 6, 2016 at 9:24 pm
    • maria claudia says:

      XML-ul:

      March 6, 2016 at 9:25 pm
    • maria claudia says:

      //////
      XML-ul:

      ////

      March 6, 2016 at 9:29 pm

Your email address will not be published. Required fields are marked *

*