Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并具有相同架构的2个xml记录_C#_.net_Xml - Fatal编程技术网

C# 合并具有相同架构的2个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>

如何合并具有相同架构的两个XML记录?

例如,假设我们有两个记录,例如:

<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