Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取具有未知根/父节点的XML节点时出现问题_C#_.net_Xml - Fatal编程技术网

C# 读取具有未知根/父节点的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("//*

我一直在尝试读取一个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>

阿拉文德
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作为引用和使用。