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"

Vedere anche

Concetti

LINQ to XML per utenti di XPath