XPath
XPath reprezintă un limbaj de interogare în XML. Acesta permite selectarea elementelor care corespund unui anumit selector.
Să analizăm câțiva dintre cei mai des utilizați selectori:
- .: selecția nodului curent
- ..: selecția nodului părinte
- *: selecția tuturor nodurilor copii ale nodului curent
- person: selecția tuturor nodurilor cu un anumit nume, în acest caz cu numele "person"
- @name: selecția atributului nodului curent, după semnul @ se indică numele atributului (în acest caz "name")
- @*: selecția tuturor atributelor nodului curent
- element[3]: selecția unui anumit nod copil după index, în acest caz al treilea nod
- //person: selecția în document a tuturor nodurilor cu numele "person"
- person[@name='Tom']: selecția elementelor cu o anumită valoare a atributului. În acest caz, sunt selectate toate elementele "person" cu atributul name='Tom'
- person[company='Microsoft']: selecția elementelor cu o anumită valoare a unui element încorporat. În acest caz, sunt selectate toate elementele "person" al căror element copil "company" are valoarea 'Microsoft'
- //person/company: selecția în document a tuturor nodurilor cu numele "company" care se află în elementele "person"
Funcționarea interogărilor XPath se bazează pe utilizarea a două metode ale clasei XmlElement:
- SelectSingleNode(): selecția unui singur nod din rezultatele interogării. Dacă interogarea returnează mai multe noduri, este selectat primul
- SelectNodes(): selecția unei colecții de noduri ca obiect XmlNodeList
Pentru interogări, vom lua documentul XML din temele anterioare:
<?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 selecta toate nodurile elementului rădăcină, adică toate elementele person:
using System.Xml;
XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;
// selecția tuturor nodurilor fiice
XmlNodeList? nodes = xRoot?.SelectNodes("*");
if (nodes is not null)
{
foreach (XmlNode node in nodes)
Console.WriteLine(node.OuterXml);
}
Afișarea în consolă:
<person name="Tom"><company>Microsoft</company><age>37</age></person>
<person name="Bob"><company>Google</company><age>41</age></person>
Vom selecta toate nodurile <person>:
XmlNodeList? personNodes = xRoot?.SelectNodes("person");
Vom afișa în consolă valorile atributelor name ale elementelor person:
using System.Xml;
XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;
XmlNodeList? personNodes = xRoot?.SelectNodes("person");
if(personNodes is not null)
{
foreach (XmlNode node in personNodes)
Console.WriteLine(node.SelectSingleNode("@name")?.Value);
}
Rezultatul afișat va fi:
Tom
Bob
Vom selecta nodul al cărui atribut name are valoarea "Tom":
XmlNode? tomNode = xRoot?.SelectSingleNode("person[@name='Tom']");
Console.WriteLine(tomNode?.OuterXml);
Să presupunem că trebuie să obținem doar companiile. Pentru aceasta, trebuie să facem o selecție în josul ierarhiei elementelor:
using System.Xml;
XmlDocument xDoc = new XmlDocument();
xDoc.Load("people.xml");
XmlElement? xRoot = xDoc.DocumentElement;
XmlNodeList? companyNodes = xRoot?.SelectNodes("//person/company");
if(companyNodes is not null)
{
foreach (XmlNode node in companyNodes)
Console.WriteLine(node.InnerText);
}
Acest cod va afișa numele companiilor asociate cu fiecare element person.