在 C# 中删除具有空属性的 XML 标记

Posted

技术标签:

【中文标题】在 C# 中删除具有空属性的 XML 标记【英文标题】:Remove XML tags with empty attribute in C# 【发布时间】:2020-06-25 12:24:04 【问题描述】:

我正在寻找一种可以有效地从 XML 中删除空标签以及没有任何属性的所有标签的好方法。

例如, 考虑以下示例 xml 文件

  <?xml version="1.0"?>
<Root xmlns:xsd="" xmlns:xsi="" name="">
  <Branches>
    <Branch name="TEST">     
      <Branches>
    <parametrs/>
    <Branch name="abc"/>
        <Branch name="Subtest">
          <Branches>
            <Branch name="sample">      
            </Branch>
          </Branches>
        </Branch>
 </Branches>
  </Branch>    
</Branches>
<Branches>
    <Branch name="TEST1">
      <Branches>
        <Branch name="Subtest">
          <Branches>
            <Branch name="sample">      
            </Branch>
          </Branches>
        </Branch>
 </Branches>
  </Branch>    
</Branches> 
</Root>

可能变成:

<?xml version="1.0"?>
<Root xmlns:xsd="" xmlns:xsi="" name="">
<Branch name="TEST">     
    <Branch name="abc"/>
        <Branch name="Subtest">   
            <Branch name="sample"/>        
        </Branch>
</Branch>    
<Branch name="TEST1">  
  <Branch name="Subtest">
      <Branch name="sample"/>         
  </Branch>
</Branch>    
</Root>

非常感谢任何帮助。

【问题讨论】:

到目前为止你有什么尝试? 【参考方案1】:

您可以执行以下操作(代码中的 cmets)。

var xdoc = XDocument.Parse(xml);
var nodesToRemove = new List<XElement>();

// Get the List of XElements that do not have any attributes and iterate them
foreach(var node in xdoc.Descendants().Where(e => !e.HasAttributes))

    // If any XElement has children, move them up
    if(node.Elements().Any())
    
        node.Parent.Add(node.Elements());

    
    // Mark the node for removal
    nodesToRemove.Add(node);


// Remove the marked nodes
foreach(var item in nodesToRemove)
   
    item.Remove();


var resultXml = xdoc.ToString();

【讨论】:

以上是关于在 C# 中删除具有空属性的 XML 标记的主要内容,如果未能解决你的问题,请参考以下文章

如何通过从 c# 对象中删除空值属性和零 (0) 值属性来优化 json

如何在 C# 中反序列化具有属性的 XML [重复]

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

检查 XML 节点是不是具有 Linq C# 的属性?

PHP - 在php中删除具有特定属性的子项[重复]

C# - 具有属性和节点值的 Xml 元素