C# 读取具有未知根/父节点的XML节点时出现问题
我一直在尝试读取一个xml文件。我必须提取节点“Date”和“Name”的值,但问题是,它们可能出现在XML层次结构的任何级别 所以当我尝试使用这个代码时C# 读取具有未知根/父节点的XML节点时出现问题,c#,.net,xml,C#,.net,Xml,我一直在尝试读取一个xml文件。我必须提取节点“Date”和“Name”的值,但问题是,它们可能出现在XML层次结构的任何级别 所以当我尝试使用这个代码时 XmlDocument doc = new XmlDocument(); doc.Load("test1.xml"); XmlElement root = doc.DocumentElement; XmlNodeList nodes = root.SelectNodes("//*
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>
阿拉文德
12/03/2000
由于
和
不是根的直接子元素,因此上述代码会出错是否可以假定父节点/根节点未知,仅使用节点名称复制值???根据您得到的异常情况,这可能是确切的解决方案,也可能不是。但是,在对它们执行
.InnerText
之前,我肯定会检查日期
和名称
是否存在
foreach (XmlNode node in nodes)
{
dateNode = node["date"];
if(dateNode != null)
date = dateNode.InnerText;
// etc.
}
根据您遇到的异常情况,这可能是确切的解决方案,也可能不是。但是,在对它们执行
.InnerText
之前,我肯定会检查日期
和名称
是否存在
foreach (XmlNode node in nodes)
{
dateNode = node["date"];
if(dateNode != null)
date = dateNode.InnerText;
// etc.
}
为了更有效地实现这一点,我会阅读XPATH和XPathforC 这里有一个小方法,可以让您轻松获取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;
}
}
为了更有效地实现这一点,我会阅读XPATH和XPathforC 这里有一个小方法,可以让您轻松获取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;
}
}
尝试使用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();
stringxml=@”
12/03/2001
阿拉文德
12/03/2000
AS-CII
";
XDocument doc=XDocument.Parse(xml);
foreach(单据子体中的var日期(“日期”))
{
Console.WriteLine(日期值);
}
foreach(单据子体(“名称”)中的var日期)
{
Console.WriteLine(日期值);
}
Console.ReadLine();
后代方法允许您获取具有指定名称的所有元素。尝试使用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();
stringxml=@”
12/03/2001
阿拉文德
12/03/2000
AS-CII
";
XDocument doc=XDocument.Parse(xml);
foreach(单据子体中的var日期(“日期”))
{
Console.WriteLine(日期值);
}
foreach(单据子体(“名称”)中的var日期)
{
Console.WriteLine(日期值);
}
Console.ReadLine();
“后代”方法允许您获取具有指定名称的所有元素。通过必要的基本编辑和解决方法,可以接受答案。:)@做记号感谢这篇有价值的文章。经过必要的基本编辑和修改,答案可以接受。:)@做记号谢谢你宝贵的帖子。谢谢你宝贵的时间和回复。:)感谢您宝贵的时间和回答。:)你能告诉我应该使用哪个名称空间吗?添加System.Xml.Linq作为引用和使用。你能告诉我应该使用哪个名称空间吗?添加System.Xml.Linq作为引用和使用。