Suchen nach Attributen von nebengeordneten Elementen mit einem bestimmten Namen (LINQ to XML)

In diesem Artikel wird gezeigt, wie Sie XPathEvaluate verwenden können, um jedes Attribut zu finden, das einen bestimmten Namen hat und auch zu einem gleichgeordneten Element des Kontextknotens gehört. Im Artikel wird auch gezeigt, wie Sie eine LINQ to XML-Abfrage für dieselbe Aufgabe verwenden.

Beispiel: Suchen aller gleichgeordneten Elemente mit dem Namen Book und anschließendes Suchen aller Attribute namens id

In diesem Beispiel wird ein Book-Element im XML-Dokument Beispiel-XML-Datei: Bücher gefunden. Anschließend werden alle gleichgeordneten Elemente mit dem Namen Book und alle Attribute namens id dieser Elemente gefunden. Das Ergebnis ist eine Auflistung von Attributen.

Der XPath-Ausdruck lautet ../Book/@id.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

Results are identical
id="bk101"
id="bk102"

Siehe auch