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