【问题标题】:How to select XML node with namespace如何选择带有命名空间的 XML 节点
【发布时间】:2014-11-03 15:26:58
【问题描述】:

我需要获取第二个<Folder> 节点下的<Item> 节点列表。如果我使用以下 XML 源代码和 C# 代码,FolderNode 设置为正确的节点(第二个 <Folder> 节点),但 ItemsList 设置为文件中每个 <Item> 的集合,包括第一个文件夹节点中的项目。所以,ItemsList 包含 5 个项目而不是 3 个。

XML 来源:

<?xml version="1.0" encoding="UTF-8"?>
<MMM xmlns="http://some.url.com/2.0">
    <Document>
        <open>1</open>
        <Folder>
            <name>Folder_1_Data</name>
            <Item>
                <description>Folder 1 Item 1</description>
            </Item>
            <Item>
                <description>Folder 1 Item 2</description>
            </Item>
        </Folder>
        <Folder>
            <name>Folder_2_Data</name>
            <Item>
                <description>Folder 2 Item A</description>
            </Item>
            <Item>
                <description>Folder 2 Item B</description>
            </Item>
            <Item>
                <description>Folder 2 Item C</description>
            </Item>
        </Folder>
    </Document>
</MMM>

C#代码:

    var doc = new XmlDocument();
    doc.Load("Import.xml");
    var nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("abc", "http://some.url.com/2.0");
    var xnlNodes = doc.SelectNodes("//abc:Document", nsmgr);
    var FolderNode = doc.SelectNodes("//abc:Folder", nsmgr).Item(1);

    var ItemsList = FolderNode.SelectNodes("//abc:Item", nsmgr);
    //Loop through each item in the 2nd folder node
    //and pull out the description of each item.

【问题讨论】:

    标签: c# xml xpath xmldocument


    【解决方案1】:

    您只需添加一个前导 . 以表明 XPath 是相对于当前的 FolderNode

    var ItemsList = FolderNode.SelectNodes(".//abc:Item", nsmgr);
                                          //^notice this dot
    

    由于&lt;Item&gt; 节点是&lt;Folder&gt; 节点的直接子节点,您也可以这样做:

    var ItemsList = FolderNode.SelectNodes("abc:Item", nsmgr);
                                          //without symbols at the beginning which..
                                          //^.. will return only direct children nodes
    

    或者这样:

    var ItemsList = FolderNode.SelectNodes("./abc:Item", nsmgr);
                                          //^using single slash which also return.. 
                                          //.. only direct children nodes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 2012-11-10
      • 2018-05-30
      • 2010-10-06
      相关资源
      最近更新 更多