2012-02-03 65 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中顯示數據,但我無法到達各個房屋。

+2

爲什麼不使用XML序列化?由於這種XML顯然是通過XML序列化生成的,所以它可能是最自然的解決方案... – 2012-02-03 12:50:55

+0

查看使用[XPath Visualizer](http://xpathvisualizer.codeplex.com/)來測試XML上的XPath查詢。 – Lukazoid 2012-02-03 13:01:54

回答

1

您可以選擇在衆議院節點是這樣的:

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

或者您可以使用Select直接得到一個強類型的對象:

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

這個假設存在一個類House與屬性IdLocation

此外,請務必考慮Thomas Levesque使用XML序列化的建議。

+0

感謝您的提示,我將如何循環訪問每個房屋以獲得''或'' – Luke 2012-02-03 13:00:06

+0

@Coulton:請參閱更新。 – 2012-02-03 13:04:39

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")); 
}