gpt4 book ai didi

c# - 帮助合并 XML 数据

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:18 25 4
gpt4 key购买 nike

我有两个包含一些相似信息的 XMLDocuments,但还有其他节点包含两者之间不同的信息。

我正在使用 XMLSerialization 将我的数据放入 here 所示的结构中

我知道您可以使用数据集合并 XML 文件,如 here 所示,但我想以某种方式将我看到的第一个文档序列化到我的类中,然后将第二个文档附加到我的类结构中。

有什么想法或有更好的方法吗?在信息相似的第二个文档上,我很乐意用第二个文档数据覆盖它,例如每个文档都有一个日期,所以我的日期属性可以是第二个文档的日期属性。

这是数据

<ROOT>
<ID>2</ID>
<PART>4a</PART>
<NAME>JEFF</NAME>
<ADDRESS>
<ST>10001</ST>
<ID>123456789</ID>
</ADDRESS>
<PARTNUMBER>001</PARTNUMBER>
<DATE>2009 -06-05T16.18.05</DATE>
</ROOT>


<ROOT>
<ID>2</ID>
<PART>4b</PART>
<NAME>JEFF</NAME>
<RELATIVE>
<ST>10001</ST>
<ID>1234567890QWERTYUIOP</ID>
</RELATIVE>
<PARTNUMBER>002</PARTNUMBER>
<DATE>2009 -06-05T16.17.41</DATE>
</ROOT>

最佳答案

你可以这样做:

void Main()
{
string xml1 = @"<ROOT>
<ID>2</ID>
<PART>4a</PART>
<NAME>JEFF</NAME>
<ADDRESS>
<ST>10001</ST>
<ID>123456789</ID>
</ADDRESS>
<PARTNUMBER>001</PARTNUMBER>
<DATE>2009 -06-05T16.18.05</DATE>
</ROOT>";


string xml2 = @"<ROOT>
<ID>2</ID>
<PART>4b</PART>
<NAME>JEFF</NAME>
<RELATIVE>
<ST>10001</ST>
<ID>1234567890QWERTYUIOP</ID>
</RELATIVE>
<PARTNUMBER>002</PARTNUMBER>
<DATE>2009 -06-05T16.17.41</DATE>
</ROOT>";

var doc1 = XDocument.Parse(xml1);
var doc2 = XDocument.Parse(xml2);

XDocument doc = MergeDocuments(doc1, doc2);
doc.Dump();
}

static XDocument MergeDocuments(XDocument doc1, XDocument doc2)
{
var root = MergeElements(doc1.Root, doc2.Root);
return new XDocument(root);
}

static XElement MergeElements(XElement e1, XElement e2)
{
var attrComparer = new XAttributeEqualityComparer();
var nameComparer = new XNameComparer();

var attributes = e2.Attributes().Union(e1.Attributes(), attrComparer).Cast<XNode>();

var elements1 = e1.Elements().OrderBy(e => e.Name, nameComparer).ToArray();
var elements2 = e2.Elements().OrderBy(e => e.Name, nameComparer).ToArray();
var elements = new List<XNode>();
int i1 = 0, i2 = 0;
while (i1 < elements1.Length && i2 < elements2.Length)
{
XElement e = null;
int compResult = nameComparer.Compare(elements1[i1].Name, elements2[i2].Name);
if (compResult < 0)
{
e = elements1[i1];
i1++;
}
else if (compResult > 0)
{
e = elements2[i2];
i2++;
}
else
{
e = MergeElements(elements1[i1], elements2[i2]);
i1++;
i2++;
}
elements.Add(e);
}
while (i1 < elements1.Length)
{
elements.Add(elements1[i1]);
i1++;
}
while (i2 < elements2.Length)
{
elements.Add(elements2[i2]);
i2++;
}

var nodes = attributes.Concat(elements).ToArray();
string value = null;
if (elements.Count == 0)
{
if (!string.IsNullOrEmpty(e1.Value))
value = e1.Value;
if (!string.IsNullOrEmpty(e2.Value))
value = e2.Value;
}
if (value != null)
return new XElement(e1.Name, nodes, value);
else
return new XElement(e1.Name, nodes);
}

class XNameComparer : IComparer<XName>
{
public int Compare(XName x, XName y)
{
int result = string.Compare(x.Namespace.NamespaceName, y.Namespace.NamespaceName);
if (result == 0)
result = string.Compare(x.LocalName, y.LocalName);
return result;
}
}

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

public int GetHashCode(XAttribute x)
{
return x.Name.GetHashCode();
}
}

关于c# - 帮助合并 XML 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532624/

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