Как выбрать узел XML с пространством имен

1

Мне нужно получить список узлов <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
xmldocument

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню