gpt4 book ai didi

c# - 删除 XML 中的重复元素

转载 作者:太空宇宙 更新时间:2023-11-03 10:57:05 26 4
gpt4 key购买 nike

我的项目需要将输入 XML 文件转换为 DataTable 的功能。我正在使用以下代码来执行此操作。

 DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
dataSourceFileStream.Seek(0, SeekOrigin.Begin);
ds.ReadXml(dataSourceFileStream);
dt = ds.Tables[0];

除非输入的 XML 有重复的元素,否则这会安静地工作,例如,如果 XML 文件如下所示:

<?xml version="1.0" encoding="iso-8859-1"?>
<DocumentElement>
<data>
<DATE>27 September 2013</DATE>
<SCHEME>Test Scheme Name</SCHEME>
<NAME>Mr John</NAME>
<SCHEME>Test Scheme Name</SCHEME>
<TYPE>1</TYPE>
</data>
</DocumentElement>

如您所见,SCHEME 元素出现了两次。当这种 XML 文件来时 ds.ReadXml(dataSourceFileStream); 无法返回正确的数据表。

有什么更好的方法来处理这个问题吗?

最佳答案

看来您必须先修复 XML。您可以使用 XDocument 和相关类来完成此操作。但首先您需要创建一个 EqualityComparer,它根据名称比较两个 XElement:

    public class MyEqualityComparer : IEqualityComparer<XElement>
{
public bool Equals(XElement x, XElement y)
{
return x.Name == y.Name;
}

public int GetHashCode(XElement obj)
{
return obj.Name.GetHashCode();
}
}

现在试试这个:

        var comparer = new MyEqualityComparer();

XDocument.Load(dataSourceFileStream);

var doc = XDocument.Parse(data);

var dataElements = doc.Element("DocumentElement").Elements("data");
foreach (var dataElement in dataElements)
{
var childElements = dataElement.Elements();
var distinctElements = childElements.Distinct(comparer).ToArray();
if (distinctElements.Length != childElements.Count())
{
dataElement.Elements().Remove();
foreach (var item in distinctElements)
dataElement.Add(item);
}
}

using (var stream = new MemoryStream())
{
var writer = new StreamWriter(stream);
doc.Save(writer);

stream.Seek(0, 0);

var ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
var mode = ds.ReadXml(stream);
var dt = ds.Tables[0];
}

这将是您问题的快速解决方法。但我强烈建议鼓励数据提供者修复 XML

关于c# - 删除 XML 中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com