2012-10-22 42 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);