1

寻找一种合并到 XML 文件的方法,其中第二个文件中的修改属性应该覆盖第一个文件中对象的值。似乎这对于 linq to xml 应该是可行的,但在弄清楚如何做到这一点时遇到了一些麻烦。

以以下两个 XML 文件为例:

文件 1:

<root>
   <foo name="1">
     <val1>hello</val1>
     <val2>world</val2>
   </foo>
   <foo name="2">
     <val1>bye</val1>
   </foo>
</root>

文件 2:

<root>
   <foo name="1">
     <val2>friend</val2>
   </foo>
</root>

所需的最终结果是将文件 2 合并到文件 1 并最终得到

<root>
   <foo name="1">
     <val1>hello</val1>
     <val2>friend</val2>
   </foo>
   <foo name="2">
     <val1>bye</val1>
   </foo>
</root>

子“foo”元素应由其“名称”值唯一标识,文件 2 中的任何设置值覆盖文件 1 中的值。

任何指向正确方向的指针将不胜感激,谢谢!

4

2 回答 2

0

您可以只迭代和更新值-虽然不知道您希望它有多通用...

class Program
{
    const string file1 = @"<root><foo name=""1""><val1>hello</val1><val2>world</val2></foo><foo name=""2""><val1>bye</val1></foo></root>";

    const string file2 = @"<root><foo name=""1""><val2>friend</val2></foo></root>";

    static void Main(string[] args)
    {
        XDocument document1 = XDocument.Parse(file1);
        XDocument document2 = XDocument.Parse(file2);

        foreach (XElement foo in document2.Descendants("foo"))
        {
            foreach (XElement val in foo.Elements())
            {
                XElement elementToUpdate = (from fooElement in document1.Descendants("foo")
                                            from valElement in fooElement.Elements()
                                            where fooElement.Attribute("name").Value == foo.Attribute("name").Value &&
                                                 valElement.Name == val.Name
                                            select valElement).FirstOrDefault();

                if (elementToUpdate != null)
                    elementToUpdate.Value = val.Value;

            }
        }

        Console.WriteLine(document1.ToString());

        Console.ReadLine();

    }
}
于 2013-02-15T18:58:12.613 回答
0

您可以从这两个构建新的 xml:

XDocument xdoc1 = XDocument.Load("file1.xml");
XDocument xdoc2 = XDocument.Load("file2.xml");

XElement root =
    new XElement("root",
        from f in xdoc2.Descendants("foo").Concat(xdoc1.Descendants("foo"))
        group f by (int)f.Attribute("name") into foos
        select new XElement("foo",
            new XAttribute("name", foos.Key),
            foos.Elements().GroupBy(v => v.Name.LocalName)
                           .OrderBy(g => g.Key)
                           .Select(g => g.First())));

root.Save("file1.xml");

因此,首先选择第二个文件中的 foo 元素,它们将优先于第一个文件中的 foo 元素(当我们进行分组时)。

于 2013-02-15T19:36:14.997 回答