다음을 통해 공유


XPath 및 LINQ to XML 비교

XPath와 LINQ to XML은 어떤 면에서 비슷합니다. XML 트리를 쿼리하여 결과를 요소 컬렉션, 특성 컬렉션, 노드 컬렉션 또는 요소나 특성의 값으로 반환하는 데 사용할 수 있습니다. 그러나 두 옵션 간에는 상당한 차이가 있습니다.

XPath와 LINQ to XML의 차이점

XPath는 새 형식의 프로젝션을 허용하지 않습니다. XPath는 트리에서 노드 컬렉션만 반환할 수 있지만, LINQ to XML은 쿼리를 실행하고 개체 그래프나 XML 트리를 새 모양으로 프로젝션할 수 있습니다. LINQ to XML 쿼리는 XPath 식보다 훨씬 더 많은 작업을 수행할 수 있습니다.

XPath 식은 문자열 내에 분리되어 존재합니다. C# 컴파일러는 컴파일 시간에 XPath 식의 구문을 분석할 수 없습니다. 이와 반대로 LINQ to XML 쿼리는 C# 컴파일러에서 구문이 분석되고 컴파일됩니다. 컴파일러는 많은 쿼리 오류를 catch할 수 있습니다.

XPath 결과는 강력한 형식이 아닙니다. 많은 경우에 XPath 식의 계산 결과는 개체이며 적절한 형식을 결정하고 필요한 경우 결과를 캐스팅하는 것은 개발자에게 달려 있습니다. 이와 반대로 LINQ to XML 쿼리의 프로젝션은 강력한 형식입니다.

결과 정렬

XPath 1.0 권장 사항에는 XPath 식의 계산 결과인 컬렉션이 정렬되지 않는다고 나와 있습니다.

그러나 LINQ to XML XPath 축 메서드에서 반환하는 컬렉션을 반복할 때 컬렉션의 노드는 문서 순서로 반환됩니다. 이는 조건자가 precedingpreceding-sibling과 같이 문서 순서의 역순으로 표현되는 XPath 축에 액세스하는 경우에도 해당됩니다.

반면 대부분의 LINQ to XML 축은 문서 순서대로 컬렉션을 반환합니다. 그러나 그 중 AncestorsAncestorsAndSelf(은)는 컬렉션을 역방향 문서 순서로 반환합니다. 다음 표에서는 축을 열거하고 각 축의 컬렉션 순서를 나타냅니다.

LINQ to XML 축 순서 지정
XContainer.DescendantNodes 문서 순서
XContainer.Descendants 문서 순서
XContainer.Elements 문서 순서
XContainer.Nodes 문서 순서
XContainer.NodesAfterSelf 문서 순서
XContainer.NodesBeforeSelf 문서 순서
XElement.AncestorsAndSelf 문서 순서의 역순
XElement.Attributes 문서 순서
XElement.DescendantNodesAndSelf 문서 순서
XElement.DescendantsAndSelf 문서 순서
XNode.Ancestors 문서 순서의 역순
XNode.ElementsAfterSelf 문서 순서
XNode.ElementsBeforeSelf 문서 순서
XNode.NodesAfterSelf 문서 순서
XNode.NodesBeforeSelf 문서 순서

위치 조건자

XPath 식에서 위치 조건자는 많은 축의 경우 문서 순서로 표현되지만 역방향 축의 경우에는 문서 순서의 역순으로 표현됩니다. 역방향 축은 preceding, preceding-sibling, ancestor, ancestor-or-self입니다. 예를 들어, XPath 식 preceding-sibling::*[1]은 바로 이전 형제를 반환합니다. 이는 최종 결과 집합이 문서 순서로 제공되는 경우에도 해당됩니다.

이와 반대로 LINQ to XML의 모든 위치 조건자는 항상 축의 순서로 표현됩니다. 예를 들어, anElement.ElementsBeforeSelf().ElementAt(0)은 바로 이전 형제가 아니라 쿼리된 요소에 대한 부모의 첫 번째 자식 요소를 반환합니다. 또 다른 예로, anElement.Ancestors().ElementAt(0)은 부모 요소를 반환합니다.

LINQ to XML에서 바로 이전 요소를 찾으려는 경우 다음 식을 작성할 수 있습니다.

ElementsBeforeSelf().Last()
ElementsBeforeSelf().Last()

성능 차이점

LINQ to XML에서 XPath 기능을 사용하는 XPath 쿼리의 성능은 LINQ to XML 쿼리보다 느립니다.

구성 비교

LINQ to XML 쿼리의 컴퍼지션은 XPath 식의 컴퍼지션과 유사하지만 구문은 매우 다릅니다.

예를 들어, customers라는 변수에 요소가 있고 CompanyName라는 모든 자식 요소 아래에서 Customer이라는 손자 요소를 찾으려는 경우 이러한 XPath 식을 작성할 수 있습니다.

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

동일한 LINQ to XML 쿼리는 다음과 같습니다.

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

각 XPath 축과 유사한 LINQ to XML 축은 다음과 같습니다.

XPath 축 LINQ to XML 축
child(기본 축) XContainer.Elements
Parent(..) XObject.Parent
attribute axis(@) XElement.Attribute

또는

XElement.Attributes
ancestor 축 XNode.Ancestors
ancestor-or-self 축 XElement.AncestorsAndSelf
descendant 축(//) XContainer.Descendants

또는

XContainer.DescendantNodes
descendant-or-self XElement.DescendantsAndSelf

또는

XElement.DescendantNodesAndSelf
following-sibling XNode.ElementsAfterSelf

또는

XNode.NodesAfterSelf
preceding-sibling XNode.ElementsBeforeSelf

또는

XNode.NodesBeforeSelf
following 직접적으로 해당하는 항목이 없습니다.
preceding 직접적으로 해당하는 항목이 없습니다.