MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Lucrul cu XML folosind clasele System.Xml

Pentru a lucra cu XML în C# se pot utiliza mai multe abordări. În primele versiuni ale framework-ului, funcționalitatea principală pentru lucrul cu XML era oferită de spațiul de nume System.Xml. În acesta sunt definite o serie de clase care permit manipularea documentului XML:

  • XmlNode: reprezintă un nod XML. Ca nod poate fi folosit întregul document sau un element individual
  • XmlDocument: reprezintă întregul document XML
  • XmlElement: reprezintă un element individual. Moștenește clasa XmlNode
  • XmlAttribute: reprezintă un atribut al unui element
  • XmlText: reprezintă valoarea unui element sub formă de text, adică acel text care se află în element între tagurile sale de deschidere și închidere
  • XmlComment: reprezintă un comentariu în XML
  • XmlNodeList: este folosit pentru a lucra cu o listă de noduri

Clasa principală care permite manipularea conținutului XML este XmlNode, așa că vom examina câteva dintre metodele și proprietățile sale principale:

  • Proprietatea Attributes returnează un obiect XmlAttributeCollection, care reprezintă o colecție de atribute
  • Proprietatea ChildNodes returnează colecția de noduri copii pentru acest nod
  • Proprietatea HasChildNodes returnează true dacă nodul curent are noduri copii
  • Proprietatea FirstChild returnează primul nod copil
  • Proprietatea LastChild returnează ultimul nod copil
  • Proprietatea InnerText returnează valoarea textului din nod
  • Proprietatea InnerXml returnează întreaga structură internă XML a nodului
  • Proprietatea Name returnează numele nodului. De exemplu, <user> - valoarea proprietății Name este "user"
  • Proprietatea ParentNode returnează nodul părinte al nodului curent

Aplicăm aceste clase și funcționalitatea lor. Mai întâi, pentru a lucra cu XML, vom crea un nou fișier. Îl vom numi people.xml și vom defini următorul conținut în el:

<?xml version="1.0" encoding="utf-8" ?>
<people>
 <person name="Tom">
   <company>Microsoft</company>
   <age>37</age>
 </person>
 <person name="Bob">
   <company>Google</company>
   <age>41</age>
 </person>
</people>

Acum, vom parcurge acest document și îi vom afișa datele în consolă:

using System.Xml;

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
// obținem elementul rădăcină
XmlElement? xRoot = xDoc.DocumentElement;
if (xRoot != null)
{
   // parcurgem toate nodurile din elementul rădăcină
   foreach (XmlElement xnode in xRoot)
   {
       // obținem atributul name
       XmlNode? attr = xnode.Attributes.GetNamedItem("name");
       Console.WriteLine(attr?.Value);

       // parcurgem toate nodurile copii ale elementului user
       foreach (XmlNode childnode in xnode.ChildNodes)
       {
           // dacă nodul este company
           if (childnode.Name == "company")
           {
               Console.WriteLine($"Company: {childnode.InnerText}");
           }
           // dacă nodul este age
           if (childnode.Name == "age")
           {
               Console.WriteLine($"Age: {childnode.InnerText}");
           }
       }
       Console.WriteLine();
   }
}

Rezultatul afișat în consolă va fi:

Tom
Company: Microsoft
Age: 37

Bob
Company: Google
Age: 41

Pentru a începe lucrul cu documentul XML, trebuie să creăm un obiect XmlDocument și apoi să încărcăm în el fișierul XML: xDoc.Load("people.xml");.

La analizarea XML-ului, mai întâi obținem elementul rădăcină al documentului cu ajutorul proprietății xDoc.DocumentElement. Apoi are loc analiza efectivă a nodurilor documentului.

În bucla foreach(XmlNode xnode in xRoot) parcurgem toate nodurile copii ale elementului rădăcină. Deoarece nodurile copii reprezintă elemente <person>, putem obține atributele acestora: XmlNode attr =

xnode.Attributes.GetNamedItem("name"); și elementele încorporate: foreach(XmlNode childnode in xnode.ChildNodes).

Pentru a determina ce fel de nod avem în față, putem compara numele acestuia: if(childnode.Name=="company").

În mod similar, putem crea obiecte ale claselor și structurilor din datele XML:

using System.Xml;

var people = new List<Person>();

XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
// obținem elementul rădăcină
XmlElement? xRoot = xDoc.DocumentElement;
if (xRoot != null)
{
   foreach (XmlElement xnode in xRoot)
   {
       Person person = new Person();
       XmlNode? attr = xnode.Attributes.GetNamedItem("name");
       person.Name = attr?.Value;

       foreach (XmlNode childnode in xnode.ChildNodes)
       {
           if (childnode.Name == "company")
               person.Company = childnode.InnerText;

           if (childnode.Name == "age")
               person.Age = int.Parse(childnode.InnerText);
       }
       people.Add(person);
   }
   foreach (var person in people)
       Console.WriteLine($"{person.Name} ({person.Company}) - {person.Age}");
}

class Person
{
   public string? Name { get; set; }
   public int Age { get; set; }
   public string? Company { get; set; }
}

În acest caz, este definită clasa Person cu trei proprietăți. La parcurgerea nodurilor fișierului XML, valorile elementelor și atributelor acestora sunt transmise obiectului clasei Person.

Afișarea în consolă a programului:

Tom (Microsoft) - 37
Bob (Google) - 41
← Lecția anterioară Lecția următoare →