【问题标题】:How do I extract child nodes from XML file using XPath when both child nodes must exist?当两个子节点都必须存在时,如何使用 XPath 从 XML 文件中提取子节点?
【发布时间】:2012-05-25 08:54:53
【问题描述】:

我正在尝试从 xml 文档中提取某些值。在下面的示例中,我想将存储在“c”和“d”节点中的值存储在列表中,但仅限于“b”节点同时包含“c”和“d”的地方。到目前为止,我的代码循环遍历所有“b”节点,但我不确定在 while 循环中放置什么,或者这是否是最好的方法。

XmlDocument attrsXML = new XmlDocument();
attrsXML.LoadXml(dbReader["SampleXml"].ToString());

XPathNavigator nav = attrsXML.CreateNavigator();

XPathNodeIterator attribNodes = nav.Select("/a/b");

while (attribNodes.MoveNext())
{
    // What do I need to put here in order to extract the 'c' and 'd' nodes?
    // Any other nodes can be ignored (such as 'e' above). I am only interested
    // when 'b' contains both 'c' AND 'd'.
}

从数据库加载的“SampleXml”是:

<a>
    <b>
        <c>Extract this</c>
        <d>And this</d>
        <e>not this</e>
    </b>
    <b>
        <c>not this</c>
        <e>not this</e>
    </b>
    <b>
        <c>Extract this</c>
        <d>And this</d>
    </b>
</a>

任何帮助表示赞赏。

【问题讨论】:

    标签: c# xpath xpathnavigator


    【解决方案1】:

    您可以使用以下代码:

    XmlDocument attrsXML = new XmlDocument();
    attrsXML.LoadXml(dbReader["SampleXml"].ToString());
    
    
    XmlNodeList nodeList = attrsXML.SelectNodes("/a/b[c and d]");
    
    foreach (XmlNode xmlNode in nodeList)
    {
      string cText = xmlNode.SelectSingleNode("c").InnerText;
      string dText = xmlNode.SelectSingleNode("d").InnerText;
    }
    

    XPath "/a/b[c and d]" 返回所有包含 c 和 d 元素作为子元素的 b 元素,这意味着您不需要在循环内手动检查它。

    【讨论】:

    • 谢谢 eminsenay - 我已更改为使用您的解决方案。比我的好多了!
    【解决方案2】:

    我是这样解决的:

    while (attribNodes.MoveNext())
    {
        string cText = String.Empty;
        string dText = String.Empty;
    
        XPathNavigator nav2 = attribNodes.Current;
    
        var cNode = nav2.SelectSingleNode("c");
    
        if (cNode != null)
        {
            cText = nameNode.ToString();
    
            var dNode = nav2.SelectSingleNode("d");
            if (dNode != null)
            {
                dText = dNode.ToString();
            }
        }
    
        if (dText != String.Empty && cText != String.Empty)
        {
            // Problem solved
        }
    }
    

    欢迎任何更好的解决方案,因为它看起来不太优雅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多