2014-11-03 81 views
1

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

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. 

回答

1

你只需要添加一个领先.,表明XPath是相对于当前FolderNode

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

由于<Item>个节点<Folder>节点的直接孩子,你也可以做到这一点的方法:

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 
相关问题