使用值从XML元素获取null值

时间:2013-12-08 21:50:29

标签: c# xml xml-parsing

我有一个像这样的XML结构:

<airports>
  <airport code="code">
  Airport name
    <location>Airport location</location>
   </airport>
...
</airports>

我正在尝试解析其代码和名称:

List<string> list = new List<string>();
XmlDocument xDoc = new XmlDocument();
xDoc.Load("file.xml");

foreach (XmlNode node in xDoc.GetElementsByTagName("airport"))
{
    list.Add(node.Attributes["code"] + " " + node.Value);
}

但不是价值,我没有得到任何东西。在调试时,它表示null中节点的值。但是,我可以在.InnerText中看到该文字。你能告诉我,问题在哪里,我怎样才能获得价值?

4 个答案:

答案 0 :(得分:1)

尝试将node.Value替换为node.FirstChild.Value

应该返回类似的内容:

"\r\n        Airport name\r\n        "

答案 1 :(得分:1)

你可能刚刚使用过innertext,但是由于Grant Winney提到机场节点的“价值”是机场节点类型(文本)的子节点。

这看起来很奇怪,但它是一种像这样处理xml的方式

<NodeA>Fred<NodeB>Bloggs</NodeB></NodeA>

即NodeA有两个子节点,一个是text类型,另一个是类型元素。其他节点类型也很适合。

答案 2 :(得分:0)

Grant Winney所说的将解决您的问题。但是,你有没有理由不使用LINQ 2 XML而不是XmlDocument?

您可以使用最少的代码快速轻松地完成您的工作:

XDocument.Load("file.xml")
    .Root
    .Elements("airport")
    .Select (s => s.Attribute("code").Value + " " + s.FirstNode)
    .ToList<string>();

<小时/> 理想情况下,如果你有机会,你应该把机场名称&#39;在<airport>中加入它自己的元素。像这样:

<airports>
  <airport code="code">
    <name>Airport name</name>
    <location>Airport location</location>
   </airport>
...
</airports>

答案 3 :(得分:0)

问题是XmlElement是XmlNode的特化,其中NodeType是Element,没有“value”,因此总是返回null。

它有属性,它有子节点。 XmlElement.InnerText的工作原理是它以递归方式构建来自子孙等的结果(其中一些是Text节点)。

请记住,XML中的文本部分实际上只是节点本身。


理想情况下,XML将被修复,使得名称是一个属性(甚至是元素中唯一的[Text]节点)。