0

我有以下代码,

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()但我不知道如何测试唯一的孩子是否为空。

4

2 回答 2

2

我的理解是,据我了解,您需要所有只有一个子节点的父节点,并且该子节点为空-

这是一个完成此任务的简单测试:它没有专门使用您的示例,但可以完成任务。如果您提供您的 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 的值。

于 2013-03-07T02:55:11.320 回答
0

我试图自己解决这个问题,这就是我想出的:

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("");
            }
于 2013-03-07T02:58:12.450 回答