我有一个像
的 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/