如何用同名节点的所有子节点填充 XmlNodeList?
Posted
技术标签:
【中文标题】如何用同名节点的所有子节点填充 XmlNodeList?【英文标题】:How populate XmlNodeList with all the children of a node with the same name? 【发布时间】:2011-07-07 22:54:53 【问题描述】:给定一个包含以下 XML 片段的 XmlNode,我如何用书节点填充 XmlNodeList?
XMLNode 节点库包含:
<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) 我尝试使用 SelectNodes() 方法,但根是较大的文档,而不是当前 XmlNode 中的库片段,该库片段是之前使用 SelectNodes 从较大的文档中选择的。
有什么想法吗? 皮特
【问题讨论】:
必须是XmlNodeList
吗?
【参考方案1】:
您可以使用 SelectNodes,并在 XPath 查询中传递一个 '.'从该节点开始搜索:
public class ***_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);
【讨论】:
可能最好使用./book
过滤直接子代而不是所有后代。
对了,我加了“隐藏宝藏”的例子,说明代码会返回所有的后代;感谢您添加这些额外信息。以上是关于如何用同名节点的所有子节点填充 XmlNodeList?的主要内容,如果未能解决你的问题,请参考以下文章
2021-10-08:填充每个节点的下一个右侧节点指针。给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找