Procedura: trovare attributi di elementi di pari livello con un nome specifico (XPath-LINQ to XML)
In questo argomento viene illustrato come trovare tutti gli attributi degli elementi di pari livello del nodo di contesto.Nella raccolta vengono restituiti solo gli attributi con un nome specifico.
L'espressione XPath è:
../Book/@id
Esempio
In questo esempio viene dapprima ricercato un elemento Book, quindi tutti gli elementi di pari livello denominati Book e infine tutti gli attributi denominati id.Il risultato è una raccolta di attributi.
Nell'esempio viene utilizzato il seguente documento XML: File XML di esempio: Books (LINQ to XML)
XDocument books = XDocument.Load("Books.xml");
XElement book =
books
.Root
.Element("Book");
// LINQ to XML query
IEnumerable<XAttribute> list1 =
from el in book.Parent.Elements("Book")
select el.Attribute("id");
// XPath expression
IEnumerable<XAttribute> list2 =
((IEnumerable)book.XPathEvaluate("../Book/@id")).Cast<XAttribute>();
if (list1.Count() == list2.Count() &&
list1.Intersect(list2).Count() == list1.Count())
Console.WriteLine("Results are identical");
else
Console.WriteLine("Results differ");
foreach (XAttribute el in list1)
Console.WriteLine(el);
Dim books as XDocument = XDocument.Load("Books.xml")
Dim book As XElement = books.Root.<Book>(0)
' LINQ to XML query
Dim list1 As IEnumerable(Of XAttribute) = _
From el In book.Parent.<Book> _
Select el.Attribute("id")
' XPath expression
Dim list2 As IEnumerable(Of XAttribute) = DirectCast(book. _
XPathEvaluate("../Book/@id"), IEnumerable).Cast(Of XAttribute)()
If list1.Count() = list2.Count() And _
(list1.Intersect(list2)).Count() = list1.Count() Then
Console.WriteLine("Results are identical")
Else
Console.WriteLine("Results differ")
End If
For Each el As XAttribute In list1
Console.WriteLine(el)
Next
L'output ottenuto eseguendo l'esempio è il seguente:
Results are identical
id="bk101"
id="bk102"