Как заполнить XmlNodeList всеми дочерними узлами с одинаковым именем? - PullRequest
1 голос
/ 08 июля 2011

Учитывая 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 "];

Полагаю, что в приведенном выше ярлыке свойства метода предполагается, что есть ЕДИНСТВЕННЫЙ дочерний объект с именем book, а не множественный!

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

XmlNodeList books = nodeLibrary.GetChildren ("book");

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

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

Есть идеи?Пит

1 Ответ

0 голосов
/ 08 июля 2011

Вы можете использовать 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);
        }
    }
}
...