私は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");
}