0

私は2つのxmlに従っています:

A.xml

<contacts>
  <contact>
    <name>Patrick Hines</name>
    <phone type="home">206-555-0144</phone>
  </contact>
</contacts>

B.xml

<contacts>
  <contact>
    <name>Patrick Hines</name>
    <phone type="home">206-555-0144</phone>
    <phone type="work">425-555-0145</phone>
    <address>
      <street1>123 Main St</street1>
      <city>Mercer Island</city>
    </address>        
  </contact>
  <contact>
    <name>Gretchen Rivas</name>
    <phone type="mobile">206-555-0163</phone>
    <DOB>10/10/87</DOB>     
    <address>
      <state>WA</state>
      <postal>68042</postal>
    </address>
  </contact>
</contacts>

B.xml には次の追加があります。

  • 要素アドレスが追加されました。
  • 1 つの新しい要素 DOB が追加されたもう 1 つの連絡先が追加されました。

問題:

  • 新しく追加された要素を一覧表示したいのですが、その子要素のすべてではありません。

  • また、XLinq と結合を使用して、新しく追加された要素を B から A にコピーしたいと考えています。

何か方法はありますか?

私は次のことを試しました:

void test()
    {
        XDocument aDoc = XDocument.Load("A.xml");
        XDocument bDoc = XDocument.Load("B.xml");

        string allGroups = string.Empty;
        string newElementsInGroup = "\n";

        List<string> ignoreGroups = new List<string>(new string[] { "SkipThisGroup1", "SkipThisGroup2"});
        foreach (XElement groupElement in bDoc.Descendants("contacts").ToList())
        {
            //I've not displayed this in above xml
            if (ignoreGroups.Contains(groupElement.Element("Name").Value))
            {
                continue;
            }

            string groupName = groupElement.Element("Name").Value;

            // Get same group from A.xml
            IEnumerable<XElement> groupsInADoc = (from c in aDoc.Descendants("Contacts")
                                                      where (string)c.Element("Name").Value == groupName
                                                      select c);

            // Proceed if group is found
            if (groupsInADoc != null && groupsInADoc.Count() > 0)
            {
                XElement groupInA = groupsInADoc.First();

                // Each group has count element, which is again not displayed in above xml
                int aGroupCount = Convert.ToInt32(groupInA.Element("Cnt").Value);
                int bGroupCount = Convert.ToInt32(groupElement.Element("Cnt").Value);

                // If count of child elements in A group is less than that of B group, find the newly added group.
                if (aGroupCount < bGroupCount)
                {
                    allGroups = string.Concat(allGroups, "  ", groupName);

                    IEnumerable<XElement> newElements = groupElement.Elements().Except(groupInA.Elements());

                    newElementsInGroup = "New elements in group " + groupName + " are : ";

                    foreach (XElement item in newElements)
                    {
                        newElementsInGroup += (item.Element("Name").Value + " ");
                    }
                }
                newElementsInGroup += "\n";
            }
        }

        MessageBox.Show(allGroups + newElementsInGroup, "Groups that have additional members");
    }
4

1 に答える 1

0

これであなたの目的が解決するかどうかはわかりませんが、始めなければなりません。これが非常にシンプルなコンソールアプリです。この目的のために:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main()
        {            
            XElement a = XElement.Load("c:\\a.xml");
            XElement b = XElement.Load("c:\\b.xml");
            IEnumerable<XElement> c = b.Descendants().Except(a.Descendants());
            foreach (XElement ele in c)
            {
                if (ele.HasElements == false)
                {
                    Console.Write(string.Format("Element: {0}\nValue: {1}\n", ele.Name.LocalName,  ele.Value));
                }
            }
            Console.ReadKey();            
        }
    }
}

お役に立てれば。

于 2013-01-23T06:50:54.990 に答える