Partager via


Procédure : rechercher des attributs de frères avec un nom spécifique (XPath-LINQ to XML)

Cette rubrique montre comment rechercher tous les attributs des frères du nœud de contexte. Seuls les attributs avec un nom spécifique sont retournés dans la collection.

L'expression XPath est la suivante :

../Book/@id

Exemple

Cet exemple recherche d'abord un élément Book, puis tous les éléments frères nommés Book, puis tous les attributs nommés id. Le résultat est une collection d'attributs.

Cet exemple utilise le document XML suivant : Exemple de fichiers XML : Livres (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

Cet exemple génère la sortie suivante :

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

Voir aussi

Concepts

LINQ to XML pour les utilisateurs XPath