如何检查一个节点是否有一个空的子元素
本文关键字:有一个 是否 元素 节点 何检查 检查 一个 | 更新日期: 2023-09-27 18:02:44
我有以下代码,
XDocument doc = XDocument.Parse(input);
var nodes = doc.Element(rootNode)
.Descendants()
.Where(n =>
(n.Value != "0"
&& n.Value != ".00"
&& n.Value != "false"
&& n.Value != "")
|| n.HasElements)
.Select(n => new
{
n.Name,
n.Value,
Level = n.Ancestors().Count() - 1,
n.HasElements
});
var output = new StringBuilder();
foreach (var node in nodes)
{
if (node.HasElements)
{
output.AppendLine(new string(' ', node.Level) + node.Name.ToString() + ":");
}
else
{
}
我的问题是,如果我的父节点只有一个空的子节点,我需要插入一个额外的空行。我不知道如何检查独生子女是否为空。
我可以使用Descendants = n.Descendants().Count()
获得后代的数量,但我不知道如何测试该独生子女是否为空。
我的理解是,您需要所有只有一个子节点的父节点,并且该子节点为空,据我所知—
这里有一个简单的测试可以完成这个任务:它没有特别使用您的示例,但完成了任务。如果您提供您的XML看起来像我可以尝试修改我的例子,以适合您的帖子,如果下面是不容易移植到您的项目:)
(取自控制台应用程序,但实际获取节点的查询应该可以工作。
static void Main(string[] args)
{
var xml = @"<root><child><thenode>hello</thenode></child><child><thenode></thenode></child></root>";
XDocument doc = XDocument.Parse(xml);
var parentsWithEmptyChild = doc.Element("root")
.Descendants() // gets all descendants regardless of level
.Where(d => string.IsNullOrEmpty(d.Value)) // find only ones with an empty value
.Select(d => d.Parent) // Go one level up to parents of elements that have empty value
.Where(d => d.Elements().Count() == 1); // Of those that are parents take only the ones that just have one element
parentsWithEmptyChild.ForEach(Console.WriteLine);
Console.ReadKey();
}
这只返回第二个节点,该节点只包含一个空节点,其中假定empty是string.Empty.
我试图自己解决这个问题,这是我想到的:
XDocument doc = XDocument.Parse(input);
var nodes = doc.Element(rootNode).Descendants()
.Where(n => (n.Value != "0" && n.Value != ".00" && n.Value != "false" && n.Value != "") || n.HasElements)
.Select(n => new { n.Name, n.Value, Level = n.Ancestors().Count() - 1,
n.HasElements, Descendants = n.Descendants().Count(),
FirstChildValue = n.HasElements?n.Descendants().FirstOrDefault().Value:"" });
var output = new StringBuilder();
foreach (var node in nodes)
{
if (node.HasElements)
{
output.AppendLine(new string(' ', node.Level) + node.Name.ToString() + ":");
if (0 == node.Level && 1 == node.Descendants && String.IsNullOrWhiteSpace(node.FirstChildValue))
output.AppendLine("");
}