2012-10-22 43 views
2

考慮以下XML:獲取某些XML節點,並保存價值

<Stations> 
<Station> 
    <Code>HT</Code> 
    <Type>123</Type> 
    <Names> 
    <Short>H'bosch</Short> 
    <Middle>Den Bosch</Middle> 
    <Long>'s-Hertogenbosch</Long> 
    </Names> 
    <Country>NL</Country> 
</Station> 
</Stations> 

有多個節點。我需要每個節點的價值。 ( - )通( - )

目前我採取 我已經從一個網頁(http://webservices.ns.nl/ns-api-stations-v2)

登錄拿到了XML將XML作爲一個字符串並將其解析爲XDocument。

var xml = XDocument.Parse(xmlString); 
foreach (var e in xml.Elements("Long")) 
{ 
    var stationName = e.ToString(); 
} 
+0

您試圖獲取哪個字段? – Codeman

+0

我試着讓stationname Long,就像你在第二個代碼示例中看到的那樣。 @ Nathan-Weeler在下面的答案中爲我提供了正確的解決方案。請注意,我使用XmlString(不是XmlStream)。 – Karamazovi

回答

3

您可以使用XPath檢索「Station」節點,然後使用更多XPath獲取每個後續​​子節點。這個例子不使用LINQ,它看起來像你可能試圖從你的問題做的,但在這裏它是:

XmlDocument xml = new XmlDocument(); 
xml.Load(xmlStream); 
XmlNodeList stations = xml.SelectNodes("//Station"); 

foreach (XmlNode station in stations) 
{ 
    var code = station.SelectSingleNode("Code").InnerXml; 
    var type = station.SelectSingleNode("Type").InnerXml; 
    var longName = station.SelectSingleNode("Names/Long").InnerXml; 
    var blah = "you should get the point by now"; 
} 

注意:如果您的xmlStream變量是String,而不是Stream,第2行使用xml.LoadXml(xmlStream);,而不是xml.Load(xmlStream)。如果是這種情況,我還會鼓勵您將變量命名爲更準確地描述您正在使用的對象(又名xmlString)。

+0

嗯,我似乎得到一個錯誤: System.dll中發生類型'System.UriFormatException'的第一次機會異常 – Karamazovi

+0

@ User1766381 - 我認爲你的xmlStream是一個Stream對象。如果它只是一個XML字符串,請改爲使用'xml.LoadXml(xmlStream)'。另外,如果它不是Stream,請考慮在源代碼中更改變量名稱以便準確描述。 –

+0

謝謝你做到了!非常感謝 – Karamazovi

0

這將爲您提供每個站元素的「長」的所有值。

var xml = XDocument.Parse(xmlStream); 
var longStationNames = xml.Elements("Long").Select(e => e.Value);