【发布时间】:2008-10-17 01:03:25
【问题描述】:
我有一个最大 3 级深度的 xml。现在通过使用 C# 或 Xpath 来检查父节点下的所有子节点是否为空的最佳方法。
提前致谢。
【问题讨论】:
我有一个最大 3 级深度的 xml。现在通过使用 C# 或 Xpath 来检查父节点下的所有子节点是否为空的最佳方法。
提前致谢。
【问题讨论】:
给定一个示例文档:
<foo>
<bar>
<baz/>
<baz>Hello, world!</baz>
<baz><qux/></baz>
</bar>
</foo>
这个表达式告诉你foo/bar 的哪些子元素有任何子元素:
foo/bar/*[count(*)>0]
这个表达式告诉你foo/bar 的哪些子节点有任何子文本节点:
foo/bar/*[text()]
所以要确保所有子元素都是空的(没有子元素或文本节点),请确保这个表达式返回 true:
not(foo/bar/*[count(*)>0 or text()])
【讨论】:
此 LINQ to XML 查询应该接近您所追求的:
XElement xml = new XElement("contacts",
new XElement("contact",
new XAttribute("contactId", ""),
new XElement("firstName", ""),
new XElement("lastName", ""),
new XElement("Address",
new XElement("Street", ""))
),
new XElement("contact",
new XAttribute("contactId", ""),
new XElement("firstName", ""),
new XElement("lastName", "")
)
);
var query = from c in xml.Elements()
where c.Value != ""
select c;
Console.WriteLine(xml);
Console.WriteLine(query.Count());
当查询计数 == 0 时,您没有包含内容的元素。
根据您所追求的,如果您对 LINQ 样式操作没有其他用途,发布的 xPath 解决方案可能更适合。
【讨论】: