XPath 및 LINQ to XML은 어떤 면에서 비슷합니다. 둘 다 XML 트리를 쿼리하여 요소 컬렉션, 특성 컬렉션, 노드 컬렉션 또는 요소 또는 특성 값과 같은 결과를 반환하는 데 사용할 수 있습니다. 그러나 두 옵션 간에는 상당한 차이가 있습니다.
XPath와 LINQ to XML의 차이점
XPath는 새 형식의 프로젝션을 허용하지 않습니다. LINQ to XML은 쿼리를 실행하고 개체 그래프 또는 XML 트리를 새 셰이프에 프로젝션할 수 있는 반면, 트리의 노드 컬렉션만 반환할 수 있습니다. LINQ to XML 쿼리는 XPath 식보다 훨씬 더 많은 작업을 수행할 수 있습니다.
XPath 식은 문자열 내에서 격리되어 있습니다. C# 컴파일러는 컴파일 시간에 XPath 식을 구문 분석하는 데 도움이 되지 않습니다. 반면 LINQ to XML 쿼리는 C# 컴파일러에서 구문 분석 및 컴파일됩니다. 컴파일러는 많은 쿼리 오류를 잡을 수 있습니다.
XPath 결과는 강력한 형식이 아닙니다. 여러 상황에서 XPath 식을 평가하는 결과는 개체이며 개발자는 적절한 형식을 결정하고 필요에 따라 결과를 캐스팅해야 합니다. 반면에 LINQ to XML 쿼리의 결과는 정확한 형식으로 제공됩니다.
결과 순서 지정
XPath 1.0 권장 사항에 따르면 XPath 식을 계산한 결과인 컬렉션의 순서가 지정되지 않습니다.
그러나 LINQ to XML XPath 축 메서드에서 반환된 컬렉션을 반복하면 컬렉션의 노드가 문서 순서로 반환됩니다. 이는 조건자가 preceding
및 preceding-sibling
과 같이 역방향 문서 순서로 표현되는 XPath 축에 액세스할 때도 마찬가지입니다.
반면 대부분의 LINQ to XML 축은 문서 순서대로 컬렉션을 반환합니다. 그러나 그 중 Ancestors 두 개와 AncestorsAndSelf컬렉션을 역방향 문서 순서로 반환합니다. 다음 표에서는 축을 열거하고 각각에 대한 컬렉션 순서를 나타냅니다.
LINQ to XML 축 기능 | 주문하기 |
---|---|
XContainer.DescendantNodes | 문서 순서 |
XContainer.하위 요소 | 문서 순서 |
XContainer.Elements | 문서 순서 |
X컨테이너.노드 | 문서 순서 |
XContainer.NodesAfterSelf | 문서 순서 |
XContainer.NodesBeforeSelf | 문서 순서 |
XElement.AncestorsAndSelf | 문서 순서 역방향 |
XElement.Attributes | 문서 순서 |
XElement.DescendantNodesAndSelf (XElement의 하위 노드 및 본인 포함) | 문서 순서 |
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 축에 대해 비슷한 유사점이 있습니다.
XPath 축 | LINQ to XML 축 기능 |
---|---|
자식(기본 축) | XContainer.Elements |
부모(..) | XObject.Parent |
특성 축(@) | XElement.Attribute 또는 XElement.Attributes |
조상 축 | XNode.Ancestors |
상위 축 또는 자체 축 | XElement.AncestorsAndSelf |
하위 축(//) | XContainer.Descendants 또는 XContainer.DescendantNodes |
후손 또는 자기 자신 | XElement.DescendantsAndSelf 또는 XElement.DescendantNodesAndSelf |
다음 형제 | XNode.ElementsAfterSelf 또는 XNode.NodesAfterSelf |
앞에 오는 형제 | XNode.ElementsBeforeSelf 또는 XNode.NodesBeforeSelf |
다음 | 직접 동등한 항목이 없습니다. |
앞 | 직접 동등한 항목이 없습니다. |
.NET