我有一个像这样的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
中看到该文字。你能告诉我,问题在哪里,我怎样才能获得价值?
答案 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]节点)。