【问题标题】:merging 2 xml records with the same schema合并 2 条具有相同架构的 xml 记录
【发布时间】:2019-10-11 16:33:32
【问题描述】:

我们如何合并 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 记录?

【问题讨论】:

    标签: c# .net xml


    【解决方案1】:

    一个简单的实现将通过元素按名称配对相应项目并创建一个新元素,选择非空白元素的文本。

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

    【讨论】:

      【解决方案2】:
          //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
      

      【讨论】:

        猜你喜欢
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多