방법: 관련 요소 찾기(XPath-LINQ to XML)
이 항목에서는 다른 요소의 값에 의해 참조되는 특성을 기준으로 선택하여 요소를 가져오는 방법을 비교합니다.
XPath 식은 다음과 같습니다.
.//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]
예
이 예제에서는 12번째 Order 요소를 찾은 다음 해당 주문의 고객을 찾습니다.
.Net에서 목록의 인덱싱은 0부터 시작하고XPath 조건자에서 노드 컬렉션의 인덱싱은 1부터 시작합니다.이 예제에서는 이 차이를 반영합니다.
이 예제에서는 XML 문서로 샘플 XML 파일: 고객 및 주문(LINQ to XML)을 사용합니다.
XDocument co = XDocument.Load("CustomersOrders.xml");
// LINQ to XML query
XElement customer1 =
(from el in co.Descendants("Customer")
where (string)el.Attribute("CustomerID") ==
(string)(co
.Element("Root")
.Element("Orders")
.Elements("Order")
.ToList()[11]
.Element("CustomerID"))
select el)
.First();
// An alternate way to write the query that avoids creation
// of a System.Collections.Generic.List:
XElement customer2 =
(from el in co.Descendants("Customer")
where (string)el.Attribute("CustomerID") ==
(string)(co
.Element("Root")
.Element("Orders")
.Elements("Order")
.Skip(11).First()
.Element("CustomerID"))
select el)
.First();
// XPath expression
XElement customer3 = co.XPathSelectElement(
".//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]");
if (customer1 == customer2 && customer1 == customer3)
Console.WriteLine("Results are identical");
else
Console.WriteLine("Results differ");
Console.WriteLine(customer1);
Dim co As XDocument = XDocument.Load("CustomersOrders.xml")
' LINQ to XML query
Dim customer1 As XElement = ( _
From el In co...<Customer> _
Where el.@CustomerID = co.<Root>.<Orders>.<Order>. _
ToList()(11).<CustomerID>(0).Value _
Select el).First()
' An alternate way to write the query that avoids creation
' of a System.Collections.Generic.List:
Dim customer2 As XElement = ( _
From el In co...<Customer> _
Where el.@CustomerID = co.<Root>.<Orders>.<Order>. _
Skip(11).First().<CustomerID>(0).Value _
Select el).First()
' XPath expression
Dim customer3 As XElement = co.XPathSelectElement _
(".//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]")
If customer1 Is customer2 And customer1 Is customer3 Then
Console.WriteLine("Results are identical")
Else
Console.WriteLine("Results differ")
End If
Console.WriteLine(customer1)
이 예제는 다음과 같이 출력됩니다.
Results are identical
<Customer CustomerID="HUNGC">
<CompanyName>Hungry Coyote Import Store</CompanyName>
<ContactName>Yoshi Latimer</ContactName>
<ContactTitle>Sales Representative</ContactTitle>
<Phone>(503) 555-6874</Phone>
<Fax>(503) 555-2376</Fax>
<FullAddress>
<Address>City Center Plaza 516 Main St.</Address>
<City>Elgin</City>
<Region>OR</Region>
<PostalCode>97827</PostalCode>
<Country>USA</Country>
</FullAddress>
</Customer>