如何使用同名节点的所有子节点填充XmlNodeList?

时间:2011-07-07 22:54:54

标签: .net xml xmlnode 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”];

我猜上面的方法属性快捷方式假设有一个名为book的SINGLE子项,而不是多个!

B)XmlNode没有GetChildren()方法:

XmlNodeList books = nodeLibrary.GetChildren(“book”);

C)XmlNode的ChildNodes属性获取所有子节点,而不仅仅是书籍节点。

D)我尝试使用SelectNodes()方法,但是root是较大的文档,而不是之前使用SelectNodes从较大文档中选择的当前XmlNode中的库片段。

有什么想法吗? 皮特

1 个答案:

答案 0 :(得分:0)

您可以使用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);
        }
    }
}