簡體   English   中英

合並 2 個具有相同架構的 xml 記錄

[英]merging 2 xml records with the same schema

我們如何合並 2 個具有相同架構的 XML 記錄?

例如,假設我們有兩條記錄,例如:

<msg>
<name>alex</name>
<payload></payload>
</msg>

第二個:

<msg>
<name></name>
<payload>blabla</payload>
</msg>

預期結果:

<msg>
<name>alex</name>
<payload>blabla</payload>
</msg>

我們只是取了非空值。

我們如何合並兩個具有相同架構的 xml 記錄?

一個簡單的實現將只是 go 通過元素按名稱配對相應的項目並創建一個選擇非空白元素的文本的新元素。

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
        )
    );
    //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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM