如何检查一个节点是否有一个空的子元素

本文关键字:有一个 是否 元素 节点 何检查 检查 一个 | 更新日期: 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("");
            }
相关文章: