Мне нужно получить список узлов <Item>
под вторым узлом <Folder>
. Если я использую следующий источник XML и код С#, FolderNode устанавливается на правильный узел (второй узел <Folder>
), но ItemsList устанавливается в коллекцию каждого <Item>
в файле, включая элементы в узле 1-й папки. Итак, 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>
Код С#:
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.
Вам просто нужно добавить лидера .
чтобы указать, что 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