2012-02-03 5 views
2

를 사용하여 자식 요소를 선택하는 방법 :XML 내가 다음 그림에 표시된 다음 XML있어 XPath를

XML File

하지만 내 인생, 선택 코드를 얻을 수 없다 집 요소는 <ArrayOfHouse> 사이입니다.

나는 그것이 하나를 선택 얻는 것을 처리 한 후, 여기에 지금까지 내 코드의 하나 개 이상의 House 요소가 될 것입니다 : 내가 관리해야하기 때문에,

// Parse the data as an XML document 
XDocument xmlHouseResults = XDocument.Parse(houseSearchResult); 

// Select the House elements 
XPathNavigator houseNavigator = xmlHouseResults.CreateNavigator(); 

XPathNodeIterator nodeIter = houseNavigator.Select("/ArrayOfHouse/House"); 

// Loop through the selected nodes 
while (nodeIter.MoveNext()) 
{ 

    // Show the House id, as taken from the XML document 
    MessageBox.Show(nodeIter.Current.SelectSingleNode("house_id").ToString()); 
} 

내가 XML의 스트림을 받고 있어요 위에 표시된 MessageBox에 데이터를 표시하지만 개별 집에 연결할 수는 없습니다.

var houses = XDocument.Parse(houseSearchResult).Descendants("House"); 
foreach(var house in houses) 
{ 
    var id = house.Element("house_id"); 
    var location = house.Element("location"); 
} 

또는 직접 강력한 형식의 개체를 가져 Select를 사용할 수 있습니다 :

+2

왜 XML 직렬화를 사용하지 않습니까? 이 XML은 분명히 XML 직렬화로 생성되었으므로 아마도 가장 자연스러운 솔루션 일 것입니다. –

+0

[XPath Visualizer] (http://xpathvisualizer.codeplex.com/)를 사용하여 XML에 대한 XPath 쿼리를 테스트 해보십시오. – Lukazoid

답변

1

이 같은 주택의 노드를 선택할 수 있습니다

var houses = XDocument.Parse(houseSearchResult) 
         .Descendants("House") 
         .Select(x => new House 
            { 
             Id = x.Element("house_id"), 
             Location = x.Element("location") 
            }); 

이것은와 클래스 House이 존재한다고 가정 속성 IdLocation.

또한 XML 직렬화를 사용하는 Thomas Levesque의 제안에 대해 생각해보십시오.

+0

힌트를 보내 주셔서 감사합니다. 그러면 각 집을 돌아가서 ''또는 '' – Luke

+0

@ Coulton을 얻습니다. 업데이트를 참조하십시오. –

0

XPath를 사용하면 XmlNamespaceManager을 사용해야하지만 XDocument이 있으므로 간단하게 LINQ to XML 축 방법을 사용할 수 있습니다.

XNamespace df = XmlHouseResults.Root.Name.Namespace; 

foreach (XElement house in XmlHouseResults.Descendants("df" + "House")) 
{ 
    MessageBox.Show((string)house.Element("df" + "house_id")); 
}