【问题标题】:How to remove null valued child nodes in Xml using c#如何使用 C# 删除 Xml 中的空值子节点
【发布时间】:2016-10-17 07:29:11
【问题描述】:

我有一个由父节点和子节点组成的 XML 文档,

<?xml version='1.0' encoding='UTF-8'?> 
<response>   
   <system_timestamp>2016-10-21 13:40:28</system_timestamp>
   <response_data>   
    <status>Active</status>   
    <profile>     
     <first_name>John</first_name>
     <last_name>Abraham</last_name>
     <ship_to_address>        
      <address_1>null</address_1>      
      <address_2>null</address_2>  
      <city>null</city>      
      <state>null</state>   
      <postal_code>null</postal_code> 
     </ship_to_address>  
    </profile>
  </response_data>  
</response>

我很少有像&lt;address_1&gt;&lt;address_2&gt; 这样的空值子节点。那么,现在我将如何删除我的子节点的那些空值。我试过了

doc.Descendants().Where(e =&gt; string.IsNullOrEmpty(e.Value)).Remove();

但这不起作用。我正在使用这个 XmlDocument doc = new XmlDocument(); doc.LoadXml(_value);

解析xml文档的代码。我们是否有任何其他方法可以使用 XMLDocument 而不是 XElement 来删除。

【问题讨论】:

  • @SeM:不,这不是重复的——因为在这种情况下元素不是实际上为空的;它们包含文本“null”。
  • @JonSkeet aa,我的错,我没有注意到。 Meena,您需要检查文本值“null”并删除它们。
  • 我们是否还有其他方法可以使用 XMLDocument 而不是 XElement 来删除。因为我正在使用“XmlDocument doc = new XmlDocument(); doc.LoadXml(_value);”此代码用于解析 XML 文档??

标签: c# .net xml


【解决方案1】:

e.Value 不是空引用或空字符串 - 它是字符串 "null",因为这是您元素中的值。

你想要:

doc.Descendants().Where(e => (string) e == "null").Remove();

【讨论】:

  • 这工作正常,但我有另一个问题我们是否有任何其他方法可以使用 XMLDocument 而不是 XElement 删除。因为我正在使用“XmlDocument doc = new XmlDocument(); doc.LoadXml(_value);”此代码用于解析 XML 文档??
  • @Meena:如果您不使用 LINQ to XML,为什么您要提出关于 LINQ to XML 的代码问题?如果可能的话,我强烈建议您使用 LINQ to XML。只需使用XDocument doc = XDocument.Parse(_value);
【解决方案2】:

当从列表中删除一个项目时,您必须从最后一个项目删除到第一个项目,否则索引会搞砸并且并非所有项目都被删除。试试这个

sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> nulls = doc.Descendants().Where(x => (string)x == "null").ToList();
            for (int i = nulls.Count - 1; i >= 0; i--)
            {
                nulls[i].Remove();
            }
        }
    }
}

【讨论】:

  • Remove 扩展方法可以很好地处理所有这些问题。唯一的问题是条件。