我一直在尝试读取xml文件。我必须提取节点“Date”和“Name”的值,但问题是,它们可能出现在XML层次结构的任何级别。
所以当我尝试使用此代码时,
XmlDocument doc = new XmlDocument();
doc.Load("test1.xml");
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("//*");
string date;
string name;
foreach (XmlNode node in nodes)
{
date = node["date"].InnerText;
name = node["name"].InnerText;
}
,XML文件是::
<?xml version="1.0" encoding="utf-8"?>
<root>
<child>
<name>Aravind</name>
<date>12/03/2000</date>
</child>
</root>
上述代码错误输出,因为<name>
和<date>
不是 root 的直接子元素。
是否可以假设父节点/根节点是未知的,只是使用节点的名称,复制值
答案 0 :(得分:2)
根据您获得的例外情况,这可能是也可能不是确切的解决方案。但是,在对date
进行name
之前,我肯定会检查.InnerText
和 foreach (XmlNode node in nodes)
{
dateNode = node["date"];
if(dateNode != null)
date = dateNode.InnerText;
// etc.
}
是否存在。
{{1}}
答案 1 :(得分:2)
我会阅读XPATH和XPATH for C#来更有效地完成这项工作
http://support.microsoft.com/kb/308333
http://www.w3schools.com/XPath/xpath_syntax.asp
这里有一个方法可以让你轻松获得innerText。
function string GetElementText(string xml, string node)
{
XPathDocument doc = new XPathDocument(xml);
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr = nav.Compile("//" + node);
XPathNodeIterator iterator = nav.Select(expr);
while (iterator.MoveNext())
{
// return 1st but there could be more
return iterator.Current.Value;
}
}
答案 2 :(得分:1)
尝试使用LINQ:
string xml = @"<?xml version='1.0' encoding='utf-8'?>
<root>
<date>12/03/2001</date>
<child>
<name>Aravind</name>
<date>12/03/2000</date>
</child>
<name>AS-CII</name>
</root>";
XDocument doc = XDocument.Parse(xml);
foreach (var date in doc.Descendants("date"))
{
Console.WriteLine(date.Value);
}
foreach (var date in doc.Descendants("name"))
{
Console.WriteLine(date.Value);
}
Console.ReadLine();
Descendants方法允许您获取具有指定名称的所有元素。