C# 合并具有相同架构的2个xml记录
如何合并具有相同架构的两个XML记录? 例如,假设我们有两个记录,例如:C# 合并具有相同架构的2个xml记录,c#,.net,xml,C#,.net,Xml,如何合并具有相同架构的两个XML记录? 例如,假设我们有两个记录,例如: <msg> <name>alex</name> <payload></payload> </msg> 亚历克斯 第二点: <msg> <name></name> <payload>blabla</payload> </msg> 布拉布拉 预期结果: <msg>
<msg>
<name>alex</name>
<payload></payload>
</msg>
亚历克斯
第二点:
<msg>
<name></name>
<payload>blabla</payload>
</msg>
布拉布拉
预期结果:
<msg>
<name>alex</name>
<payload>blabla</payload>
</msg>
亚历克斯
布拉布拉
我们只取非空值
如何将两个xml记录合并到同一个模式?一个简单的实现就是通过元素按名称配对相应的项,然后创建一个新元素,选择非空白元素的文本
XElement ShallowMerge(XElement a, XElement b) =>
new XElement(a.Name,
from ae in a.Elements()
join be in b.Elements() on ae.Name equals be.Name
select new XElement(ae.Name,
!String.IsNullOrWhiteSpace((string)ae)
? (string)ae
: (string)be
)
);
//用于临时存储.xml数据的两个列表
List list1=新列表();
List list2=新列表();
List list3=新列表()//混合用
字符串路径=@“c:\…”;
//.xml注释的属性,如“name”和“payload”
公共阶层人士
{
公共字符串名称{get;set;}//1
公共字符串有效负载{get;set;}//2
}
//快速加载这两个.xml文件
无效荷载清单1()
{
XmlDocument xdoc=新的XmlDocument();
加载(路径+@“\list1.xml”);
foreach(xdoc.SelectNodes(“项/项”)中的XmlNode xnode)
{
人员p=新人员();
p、 name=xnode。选择SingleNode(“a”)。InnerText;
p、 有效负载=xnode。选择SingleNode(“b”)。InnerText;
清单1.项目。添加(p);
}
}
无效荷载清单2()
{
XmlDocument xdoc=新的XmlDocument();
加载(路径+@“\list2.xml”);
foreach(xdoc.SelectNodes(“项/项”)中的XmlNode xnode)
{
人员p=新人员();
p、 name=xnode。选择SingleNode(“a”)。InnerText;
p、 有效负载=xnode。选择SingleNode(“b”)。InnerText;
清单2.项目。添加(p);
}
}
//开始混合两个列表
void mixdata()
{
对于(int i=0;i
//two lists for temp storing .xml data
List<Person> list1= new List<Person>();
List<Person> list2= new List<Person>();
List<Person> list3= new List<Person>();//for mixing
string path=@"c:\.....";
//properties of .xml notes like 'name' and 'payload'
public class Person
{
public string name{ get; set; }//1
public string payload{ get; set; }//2
}
//load both .xml files saperatly
void load_list1()
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(path + @"\list1.xml");
foreach (XmlNode xnode in xdoc.SelectNodes("Items/Item"))
{
Person p = new Person();
p.name= xnode.SelectSingleNode("a").InnerText;
p.payload= xnode.SelectSingleNode("b").InnerText;
list1.Items.Add(p);
}
}
void load_list2()
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(path + @"\list2.xml");
foreach (XmlNode xnode in xdoc.SelectNodes("Items/Item"))
{
Person p = new Person();
p.name= xnode.SelectSingleNode("a").InnerText;
p.payload= xnode.SelectSingleNode("b").InnerText;
list2.Items.Add(p);
}
}
//start mixing both lists
void mixdata()
{
for(int i=0;i<list1.Items.Count;i++)
{
Person p= new Person();
p.name=list1.Items[i].name;
p.payload=list2.Items[i].payload;
list3.Items.Add(p);
}
}
//saving final mixed list to .xml
void save()
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(path + @"\Mixed_data.xml");
XmlNode xnode = xdoc.SelectSingleNode("Items");
xnode.RemoveAll();
foreach (Person i in list3)
{
XmlNode xtop = xdoc.CreateElement("Item");
XmlNode x1 = xdoc.CreateElement("a");
XmlNode x2 = xdoc.CreateElement("b");
x1.InnerText = i.name;
x2.InnerText = i.payload;
xtop.AppendChild(x1);
xtop.AppendChild(x2);
xdoc.DocumentElement.AppendChild(xtop);
}
xdoc.Save(path + @"\data.xml");
}
//let me know any errors