Selecția elementelor în LINQ to XML
Un mare avantaj al LINQ to XML este că această tehnologie permite extragerea ușoară a elementelor necesare dintr-un document XML. De exemplu, să luăm fișierul XML people.xml, creat în tema anterioară:
<?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>
Vom parcurge elementele acestuia și le vom afișa valorile în consolă:
using System.Xml.Linq;
XDocument xdoc = XDocument.Load("people.xml");
// obținem nodul rădăcină
XElement? people = xdoc.Element("people");
if (people is not null)
{
// parcurgem toate elementele person
foreach (XElement person in people.Elements("person"))
{
XAttribute? name = person.Attribute("name");
XElement? company = person.Element("company");
XElement? age = person.Element("age");
Console.WriteLine($"Person: {name?.Value}");
Console.WriteLine($"Company: {company?.Value}");
Console.WriteLine($"Age: {age?.Value}");
Console.WriteLine(); // pentru separare în consolă
}
}
Rezultatul afișat va fi:
Person: Tom
Company: Microsoft
Age: 37
Person: Bob
Company: Google
Age: 41
Pentru a începe lucrul cu un fișier XML existent, trebuie mai întâi să-l încărcăm folosind metoda statică XDocument.Load(), în care se transmite calea către fișier:
XDocument xdoc = XDocument.Load("people.xml");
Deoarece XML-ul stochează elementele într-o structură ierarhică, pentru a accesa elementele, trebuie să începem de la cel mai înalt nivel din această ierarhie și să coborâm. Astfel, pentru a obține elementele person și a accesa valorile acestora, trebuie să ne adresăm mai întâi elementului rădăcină și, prin acesta, elementelor person:
// obținem nodul rădăcină
XElement? people = xdoc.Element("people");
if (people is not null)
{
// parcurgem toate elementele person
foreach (XElement person in people.Elements("person"))
{
Metoda Element("nume_element") returnează primul element găsit cu acest nume. Metoda Elements("nume_element") returnează o colecție de elemente cu același nume. În acest caz, obținem o colecție de elemente person, pe care o putem parcurge într-o buclă.
Coborând mai jos în ierarhie, putem obține atributele sau elementele încorporate, de exemplu, obținerea elementului <company>:
XElement? company = person.Element("company");
Valoarea elementelor simple, care conțin un singur text, poate fi obținută folosind proprietatea Value:
string? companyValue = person.Element("company")?.Value;
Combinând operatorii LINQ și LINQ to XML, putem extrage și prelucra datele din document destul de ușor. De exemplu:
using System.Xml.Linq;
XDocument xdoc = XDocument.Load("people.xml");
var microsoft = xdoc.Element("people")? // obținem nodul rădăcină people
.Elements("person") // obținem toate elementele person
// obținem toate persoanele care au company = Microsoft
.Where(p => p.Element("company")?.Value == "Microsoft")
.Select(p => new // pentru fiecare obiect creăm un obiect anonim
{
name = p.Attribute("name")?.Value,
age = p.Element("age")?.Value,
company = p.Element("company")?.Value
});
if (microsoft is not null)
{
foreach (var person in microsoft)
{
Console.WriteLine($"Name: {person.name} Age: {person.age}");
}
}
În acest caz, selectăm toate elementele person al căror element încorporat company este egal cu "Microsoft". Apoi, pe baza selecției obținute, creăm un set de obiecte anonime cu trei proprietăți. Pentru afișare, s-ar putea crea o clasă sau o structură specială și utilizarea lor în locul obiectului anonim.
Un alt exemplu - selectăm elementul person în care atributul name este egal cu "Tom":
using System.Xml.Linq;
XDocument xdoc = XDocument.Load("people.xml");
var tom = xdoc.Element("people")? // obținem nodul rădăcină people
.Elements("person") // obținem toate elementele person
.FirstOrDefault(p => p.Attribute("name")?.Value == "Tom");
var name = tom?.Attribute("name")?.Value;
var age = tom?.Element("age")?.Value;
var company = tom?.Element("company")?.Value;
Console.WriteLine($"Name: {name} Age: {age} Company: {company}");
Acest cod extrage și afișează detaliile primei persoane din documentul XML care are atributul name cu valoarea "Tom".