Partager via


Comparaison de XPath et LINQ to XML

XPath et LINQ to XML offrent certaines fonctionnalités similaires.Tous deux peuvent être utilisés pour interroger une arborescence XML et retourner des résultats tels qu'une collection d'élément, une collection d'attributs, une collection de nœuds ou la valeur d'un élément ou attribut.Il existe toutefois certaines différences.

Différences entre XPath et LINQ to XML

XPath n'autorise pas la projection de nouveaux types.Il ne peut retourner que des collections de nœuds à partir de l'arborescence, tandis que LINQ to XML peut exécuter une requête et projeter un graphique d'objet ou une arborescence XML dans une nouvelle forme.Les requêtes LINQ to XML englobent beaucoup plus de fonctionnalités et sont beaucoup plus puissantes que les expressions XPath.

Les expressions XPath existent de manière isolée dans une chaîne.Le compilateur C# ou Visual Basic ne peut s'empêcher d'analyser l'expression XPath au moment de la compilation.En revanche, les requêtes LINQ to XML sont analysées et compilées par le compilateur C# ou Visual Basic.Le compilateur est capable d'intercepter de nombreuses erreurs de requête.

Les résultats XPath ne sont pas fortement typées.Dans certaines circonstances, le résultat de l'évaluation d'une expression XPath est un objet et il incombe au développeur de déterminer le type correct et de convertir le résultat si nécessaire.En revanche, les projections à partir d'une requête LINQ to XML sont fortement typées.

Ordonnancement des résultats

La Recommandation XPath 1.0 stipule qu'une collection qui est le résultat de l'évaluation d'une expression XPath n'est pas ordonnée.

Toutefois, lors de l'itération d'une collection retournée par une méthode d'axe XPath LINQ to XML, les nœuds de la collection sont retournés dans l'ordre du document.Cela est valable même lors de l'accès à des axes XPath où les prédicats sont exprimés dans l'ordre inverse du document, par exemple preceding et preceding-sibling.

Par contraste, la plupart des axes LINQ to XML retournent les collections dans l'ordre du document, mais deux d'entre eux, Ancestors et AncestorsAndSelf, retournent les collections dans l'ordre inverse du document.Le tableau suivant énumère les axes et indique l'ordre de collection pour chacun d'eux :

Axe LINQ to XML

Ordre

XContainer.DescendantNodes

Ordre du document

XContainer.Descendants

Ordre du document

XContainer.Elements

Ordre du document

XContainer.Nodes

Ordre du document

XContainer.NodesAfterSelf

Ordre du document

XContainer.NodesBeforeSelf

Ordre du document

XElement.AncestorsAndSelf

Ordre inverse du document

XElement.Attributes

Ordre du document

XElement.DescendantNodesAndSelf

Ordre du document

XElement.DescendantsAndSelf

Ordre du document

XNode.Ancestors

Ordre inverse du document

XNode.ElementsAfterSelf

Ordre du document

XNode.ElementsBeforeSelf

Ordre du document

XNode.NodesAfterSelf

Ordre du document

XNode.NodesBeforeSelf

Ordre du document

Prédicats de position

Dans une expression XPath, les prédicats de position sont exprimés dans l'ordre du document pour de nombreux axes, mais dans l'ordre inverse du document pour les axes inversés, qui sont preceding, preceding-sibling, ancestor et ancestor-or-self.Par exemple, l'expression XPath preceding-sibling::*[1] retourne le frère qui précède.C'est le cas même si le jeu de résultats final est présenté dans l'ordre du document.

Par contraste, tous les prédicats de position dans LINQ to XML sont toujours exprimés dans l'ordre de l'axe.Par exemple, anElement.ElementsBeforeSelf().ToList()[0] retourne le premier élément enfant du parent de l'élément interrogé, mais pas l'enfant qui précède.Autre exemple : anElement.Ancestors().ToList()[0] retourne l'élément parent.

Notez que l'approche ci-dessus matérialise l'intégralité de la collection.Il ne s'agit pas de la méthode la plus efficace pour écrire cette requête.Elle a été écrite de cette façon afin d'illustrer le comportement des prédicats de position.Une méthode plus appropriée pour écrire la même requête consiste à utiliser la méthode First, comme suit : anElement.ElementsBeforeSelf().First().

Si vous souhaitez rechercher l'élément qui précède dans LINQ to XML, vous devez écrire l'expression suivante :

ElementsBeforeSelf().Last()

Différences en matière de performances

Les requêtes XPath qui utilisent la fonctionnalité XPath dans LINQ to XML présentent des performances inférieures à celles des requêtes LINQ to XML.

Comparaison de la composition

La composition d'une requête LINQ to XML est quelque peu parallèle à celle d'une expression XPath, bien qu'elle soit très différente en termes de syntaxe.

Par exemple, si vous avez un élément dans une variable nommée customers et que vous souhaitez trouver un élément petit-enfant CompanyName sous tous les éléments enfants nommés Customer, vous devez écrire une expression XPath comme suit :

customers.XPathSelectElements("./Customer/CompanyName");
customers.XPathSelectElements("./Customer/CompanyName")

La requête LINQ to XML équivalente est la suivante :

customers.Element("Customer").Elements("CompanyName");
customers.Element("Customer").Elements("CompanyName")

Il existe des parallèles similaires pour chacun des axes XPath.

Axe XPath

Axe LINQ to XML

enfant (l'axe par défaut)

XContainer.Elements

Parent (..)

XObject.Parent

axe des attributs (@)

XElement.Attribute

ou

XElement.Attributes

axe des ancêtres

XNode.Ancestors

axe ancestor-or-self

XElement.AncestorsAndSelf

axe des descendants (//)

XContainer.Descendants

ou

XContainer.DescendantNodes

descendant-or-self

XElement.DescendantsAndSelf

ou

XElement.DescendantNodesAndSelf

frère suivant

XNode.ElementsAfterSelf

ou

XNode.NodesAfterSelf

frère précédent

XNode.ElementsBeforeSelf

ou

XNode.NodesBeforeSelf

suivant

Aucun équivalent direct.

précédent

Aucun équivalent direct.

Voir aussi

Concepts

LINQ to XML pour les utilisateurs XPath