读取具有相同名称的不同级别的XML节点

时间:2015-08-12 07:56:10

标签: c# xml

我有一个xml,它在不同级别具有相同的元素名称,我尝试使用此代码读取它,

 xDoc.Load(url);
     XmlNodeList nodeList = xDoc.SelectNodes(string.Format("/DirectionsResponse/route"));
    foreach (XmlNode node in nodeList)
    {
        XmlElement companyElement = (XmlElement)node;

        kl = companyElement.GetElementsByTagName("summary")[0].InnerText;
        kl = companyElement.GetElementsByTagName("distance")[0].InnerText;
    }

我可以读取摘要元素,但问题在于<distance>元素,它会读取它找到的第一个<distance>节点。我想阅读不在<distance>节点中的<step>元素。

任何人都可以告诉我该怎么做

enter image description here

2 个答案:

答案 0 :(得分:3)

来自MSDN,GetElementsByTagName

  

返回包含所有后代元素列表的XmlNodeList    与指定的名称匹配。

它是完整的子树搜索,而不是&#34;选择子节点&#34;功能。要选择单个子节点,请使用SelectSingleNode。对于像你的&#34;步骤&#34;一些,使用SelectNodes并正确迭代它们。

答案 1 :(得分:1)

您可以使用SelectSingleNodeSelectNodes来描述XPath中的元素,就像您在第XmlNodeList nodeList = xDoc.SelectNodes("/DirectionsResponse/route");行所做的那样。

xDoc.Load(url);
XmlNodeList nodeList = xDoc.SelectNodes(string.Format("/DirectionsResponse/route"));
foreach (XmlNode node in nodeList)
{
    XmlElement companyElement = (XmlElement)node;

    kl = companyElement.SelectSingleNode("summary").InnerText; // summary node within current context
    kl = companyElement.SelectSingleNode("distance").InnerText;
}

应该这样做。

在我看来,最好在各处使用通用的XPath SelectSingleNodeSelectNodes方法。
如果您有任何疑问,请read more about XPath at MSDN

顺便说一句,您可以将XmlElement指定为枚举类型,而不是明确转换它:

xDoc.Load(url);
foreach (XmlElement element in xDoc.SelectNodes("/DirectionsResponse/route")) 
{
    kl = element.SelectSingleNode("summary").InnerText;
    kl = element.SelectSingleNode("distance").InnerText;
}