c# - 使用 C# 从 Xml 中删除重复节点

标签 c# xml

我有一个像

的 xml
<xml>
 <Test>
  <TestData>
   <TestData>
    <Name>Alex</Name>
   </TestData>
  </TestData>
 </Test>
 <Name>
 <NameData>
   <NameData>
    <Name>Chris</Name>
   </NameData>
  </NameData>
 </Name>
</xml>

我想从 xml 中删除 TestData 和 NameData 的重复节点,以便 xml 看起来像这样

 <xml>
     <Test>
      <TestData>
        <Name>Alex</Name>
      </TestData>
     </Test>
     <Name>
     <NameData>
        <Name>Chris</Name>
      </NameData>
     </Name>
    </xml>

我尝试寻找一些线索,但我遇到的每个建议都指定了节点名称。我有大量的 xml。我可以使用任何 C# 类/方法来删除重复项。

最佳答案

如果满足一些假设,LINQ to XML 会使这个过程相当容易:

  • 不存在“三重重复”的元素,例如<TestData><TestData><TestData> 。我确信解决这个问题是可行的,但比较棘手。
  • 我们不需要担心非元素子元素(例如 TestData 具有文本内容以及嵌套的 TestData 元素)
  • 我们不需要担心属性

在这种情况下,只需检查是否存在一个子元素,并且它与父元素具有相同的名称...然后替换它。

这里有一些代码可以做到这一点:

using System;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main(string[] args)
    {
        var doc = XDocument.Load("test.xml");
        var replacements = doc.Descendants()
            .Select(GetReplacementForParent)
            .Where(r => r != null)
            .ToList();
        foreach (var replacement in replacements)
        {
            replacement.Parent.ReplaceWith(replacement);
        }
        Console.WriteLine(doc);
    }

    static XElement GetReplacementForParent(XElement element)
    {
        var child = element.Elements(element.Name).FirstOrDefault();
        // TODO: Use a more efficient approach for counting children, maybe.
        // TODO: Check for non-element content? Check for attributes?
        return child != null && element.Elements().Count() == 1
            ? child : null;
    }
}

关于c# - 使用 C# 从 Xml 中删除重复节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44725577/

相关文章:

c# - (C#) 从 "long recordingId = Calendar.getInstance().getTimeInMillis();"返回时间戳

javascript - 更新表中的 XMLHttpRequest API 显示

php - 当其中已经有内容时,如何获取 xml 标签的内部文本?

android - 我创建的简单 android 应用程序在我尝试在 android studio 中运行时崩溃了

java - 使用 Spring MVC 的 XML View

ruby - Nokogiri:如何通过其子标签的内容之一获取 xml 类

c# - 在 Xamarin Forms iOS 应用程序中访问共享存储位置

c# - 如何使用 GDI+ 仅转换特定颜色的像素?

c# - ConfigureAwait(false) 没有按预期使 HttpContext NULL

c# - Asp.Net MVC4 - 部分 View 中的表单