Здравствуйте!
Есть задача объеденить две xml с одинаковой структурой
1:
+ |
<?xml version="1.0" ?>
<menu>
<game name="123" index="" images="">
<description>123</description>
<cloneof></cloneof>
<crc></crc>
<manufacturer>J-Wing</manufacturer>
<year>1996</year>
<genre></genre>
</game>
<game name="123" index="" images="">
<description>123</description>
<cloneof></cloneof>
<crc></crc>
<manufacturer>J-Wing</manufacturer>
<year>1996</year>
<genre></genre>
</game>
<game name="1qeee" index="" images="">
<description>qweqwe</description>
<cloneof></cloneof>
<crc></crc>
<manufacturer>J-Wing</manufacturer>
<year>1996</year>
<genre></genre>
</game>
</menu>
2:
<?xml version="1.0" ?>
<menu>
<game name="123" index="" images="">
<description>123</description>
<cloneof></cloneof>
<crc></crc>
<manufacturer>J-Wing</manufacturer>
<year>1996</year>
<genre></genre>
</game>
<game name="456" index="" images="">
<description>456</description>
<cloneof></cloneof>
<crc></crc>
<manufacturer>J-Wing</manufacturer>
<year>1996</year>
<genre></genre>
</game>
</menu>
|
При этом необходимо оставить только уникальные узлы. Уникальность определяется по атрибуту name
Сделал так:
public class GameComparer : IEqualityComparer<XElement>
{
public bool Equals(XElement x, XElement y)
{
return x.Attribute("name").Value == y.Attribute("name").Value;
}
public int GetHashCode(XElement obj)
{
return (obj == null ? 0 : obj.GetHashCode());
}
}
class XmlMerge
{
public static XmlDocument Merge(string xml1, string xml2)
{
XElement root1 = XElement.Parse(xml1);
XElement root2 = XElement.Parse(xml2);
StringBuilder s = new StringBuilder();
IEnumerable<XElement> games1 = from a in root1.Elements("game") select a;
IEnumerable<XElement> games2 = from b in root2.Elements("game") select b;
IEnumerable<XElement> games = from g in games1.Union(games2).Distinct() select g;
s.Append("<?xml version=\"1.0\"?>");
s.Append("<menu>");
foreach (XElement el in games)
{
s.Append(el);
}
s.Append("</menu>");
XmlDocument doc = new XmlDocument();
doc.LoadXml(s.ToString());
return doc;
}
}
В итоговом XML все равно присутствуют дубликаты, при отладке вообще не заходит в метод GameComparer.Equal
Что может быть не так, в каком направлении копать?