Как заполнить XmlNodeList всеми дочерними элементами узла с тем же именем?

Учитывая XmlNode, содержащий следующий фрагмент XML, как сделать Я заполняю XmlNodeList книжными узлами?

XMLNode nodeLibrary содержит:

<library>
  <book>
      <title>Three Little Pigs</title>
  </book>
  <book>
      <title>Batman</title>
  </book>
  <address>123 Main St.</address>
  <phone>111-111-1111</phone>
</library>

Это должно быть очень просто, но я не могу понять:

A) Невозможно неявно преобразовать тип System.Xml.XmlElement в System.Xml.XmlNodeList:

XmlNodeList books = nodeLibrary ["книга"];

Я предполагаю, что ярлык свойства метода выше предполагает, что есть ОДИН ребенок с именем book, а не несколько!

Б) XmlNode не имеет метода GetChildren ():

XmlNodeList books = nodeLibrary.GetChildren («книга»);

C) Свойство ChildNodes XmlNode получает ВСЕ дочерние узлы, не только узлы книги.

D) Я попытался использовать метод SelectNodes (), но корень - это более крупный документ, а не фрагмент библиотеки в текущем XmlNode, который был выбран из более крупного документа ранее с помощью SelectNodes.

Любые идеи? Пит


person Pete Alvin    schedule 07.07.2011    source источник
comment
Это должен быть XmlNodeList?   -  person R. Martinho Fernandes    schedule 08.07.2011


Ответы (1)


Вы можете использовать SelectNodes, а в запросе XPath передать '.' чтобы начать поиск с этого узла:

public class StackOverflow_6618097
{
    const string XML = @"<buildings>
 <library>
  <book>
   <title>Three Little Pigs</title>
  </book>
  <book>
   <title>Batman</title>
  </book>
  <address>123 Main St.</address>
  <phone>111-111-1111</phone>
  <hidden>
   <book>
    <title>The Hidden Treasure</title>
   </book>
  </hidden>
 </library>
 <bookstore>
  <book>
   <title>Cat in the Hat</title>
  </book>
 </bookstore>
</buildings>";

    public static void Test()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(XML);
        XmlNode libraryNode = doc.SelectSingleNode("//library");
        XmlNodeList libraryBooks = libraryNode.SelectNodes(".//book");
        Console.WriteLine("Books: {0}", libraryBooks.Count);
        foreach (XmlNode node in libraryBooks)
        {
            Console.WriteLine(node.OuterXml);
        }
    }
}
person carlosfigueira    schedule 07.07.2011
comment
Вероятно, лучше всего использовать ./book для фильтрации прямых потомков, а не всех потомков. - person R. Martinho Fernandes; 08.07.2011
comment
Правильно, я добавил пример «Скрытое сокровище», чтобы показать, что код вернет всех потомков; спасибо за добавление этой дополнительной информации. - person carlosfigueira; 08.07.2011