Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
XPath och LINQ till XML liknar på vissa sätt. Båda kan användas för att köra frågor mot ett XML-träd och returnera sådana resultat som en samling element, en samling attribut, en samling noder eller värdet för ett element eller attribut. Det finns dock betydande skillnader mellan de två alternativen.
Skillnader mellan XPath och LINQ till XML
XPath tillåter inte projektion av nya typer. Den kan bara returnera samlingar av noder från trädet, medan LINQ till XML kan köra en fråga och projicera ett objektdiagram eller ett XML-träd i en ny form. LINQ till XML-frågor kan göra mycket mer än XPath-uttryck.
XPath-uttryck finns isolerat i en sträng. C#-kompilatorn kan inte hjälpa till att parsa XPath-uttrycket vid kompileringstillfället. LINQ till XML-frågor parsas däremot och kompileras av C#-kompilatorn. Kompilatorn kan fånga upp många frågefel.
XPath-resultat är inte starkt typade. Under ett antal omständigheter är resultatet av utvärderingen av ett XPath-uttryck ett objekt, och det är upp till utvecklaren att fastställa rätt typ och omvandla resultatet efter behov. Däremot är projektionerna från en LINQ till XML-fråga starkt typade.
Resultatordning
XPath 1.0-rekommendationen anger att en samling som är resultatet av utvärderingen av ett XPath-uttryck är osorterad.
Men när du itererar genom en samling som returneras av en LINQ-till XML XPath-axelmetod returneras noderna i samlingen i dokumentordning. Detta gäller även vid åtkomst till XPath-axlarna där predikat uttrycks i omvänd dokumentordning, till exempel preceding och preceding-sibling.
Däremot returnerar de flesta LINQ-till XML-axlarna samlingar i dokumentordning. Men två av dem, Ancestors och AncestorsAndSelf, returnerar samlingar i omvänd dokumentordning. Följande tabell räknar upp axlarna och anger samlingsordningen för varje axel.
| LINQ till XML-axel | Beställning |
|---|---|
| XContainer.DescendantNodes | Dokumentordning |
| XContainer.Descendants | Dokumentordning |
| XContainer.Elements | Dokumentordning |
| XContainer.Nodes | Dokumentordning |
| XContainer.NodesAfterSelf | Dokumentordning |
| XContainer.NodesBeforeSelf | Dokumentordning |
| XElement.AncestorsAndSelf | Omvänd dokumentordning |
| XElement.Attributes | Dokumentordning |
| XElement.DescendantNodesAndSelf | Dokumentordning |
| XElement.DescendantsAndSelf | Dokumentordning |
| XNode.Ancestors | Omvänd dokumentordning |
| XNode.ElementsAfterSelf | Dokumentordning |
| XNode.ElementsBeforeSelf | Dokumentordning |
| XNode.NodesAfterSelf | Dokumentordning |
| XNode.NodesBeforeSelf | Dokumentordning |
Positionspredikat
I ett XPath-uttryck uttrycks positionspredikat i dokumentordning för många axlar, men uttrycks i omvänd dokumentordning för omvända axlar. De omvända axlarna är: preceding, preceding-sibling, ancestoroch ancestor-or-self. XPath-uttrycket preceding-sibling::*[1] returnerar till exempel det omedelbart föregående syskonet. Så är fallet även om den slutliga resultatuppsättningen presenteras i dokumentordning.
Däremot uttrycks alla positionspredikat i LINQ till XML alltid i axelordning. Returnerar till exempel anElement.ElementsBeforeSelf().ElementAt(0) det första barn-elementet hos det överordnade elementet till det frågade elementet, inte det närmaste föregående syskonet. Ett annat exempel: anElement.Ancestors().ElementAt(0) returnerar det överordnade elementet.
Om du vill hitta det omedelbart föregående elementet i LINQ till XML skriver du följande uttryck:
ElementsBeforeSelf().Last()
ElementsBeforeSelf().Last()
Prestandaskillnader
XPath-frågor som använder XPath-funktionerna i LINQ till XML blir långsammare än LINQ till XML-frågor.
Jämförelse av sammansättning
Sammansättningen av en LINQ till XML-fråga liknar sammansättningen av ett XPath-uttryck, men syntaxen skiljer sig mycket åt.
Om du till exempel har ett element i en variabel med namnet customers, och du vill hitta ett barnbarnselement med namnet CompanyName under alla underordnade element med namnet Customer, skriver du det här XPath-uttrycket:
customers.XPathSelectElements("./Customer/CompanyName")
customers.XPathSelectElements("./Customer/CompanyName")
Motsvarande LINQ till XML-fråga är:
customers.Elements("Customer").Elements("CompanyName")
customers.Elements("Customer").Elements("CompanyName")
Det finns liknande paralleller för var och en av XPath-axlarna.
| XPath-axel | LINQ till XML-axel |
|---|---|
| barn (standardaxeln) | XContainer.Elements |
| Förälder (..) | XObject.Parent |
| attribut axel (@) | XElement.Attribute eller XElement.Attributes |
| förfaderaxel | XNode.Ancestors |
| ancestor-or-self-axis | XElement.AncestorsAndSelf |
| efterkommande axel (//) | XContainer.Descendants eller XContainer.DescendantNodes |
| avkomling-eller-sig-själv | XElement.DescendantsAndSelf eller XElement.DescendantNodesAndSelf |
| följande syskon | XNode.ElementsAfterSelf eller XNode.NodesAfterSelf |
| föregående syskon | XNode.ElementsBeforeSelf eller XNode.NodesBeforeSelf |
| följande | Ingen direkt motsvarighet. |
| föregående | Ingen direkt motsvarighet. |