在XDocument中合并XML文件

17

我试图将几个 XML 文件合并成一个 XDocument 对象。

XDocument 对象中不存在合并功能,我很遗憾。

是否已经有人实现了 XDocument 的合并扩展方法或类似的东西?

4个回答

28

我自己也尝试了一下:

var MyDoc = XDocument.Load("File1.xml");
MyDoc.Root.Add(XDocument.Load("File2.xml").Root.Elements());

我不知道这是好还是坏,但对我而言它很有效 :-)


3
将目录中的所有xml文件合并为一个XDocument
public static XDocument MergeDir(string xmlDir)
{
    XDocument xdoc = XDocument.Parse("<root></root>");
    System.IO.DirectoryInfo directory = new DirectoryInfo(xmlDir);
    if (directory.Exists)
    {
        foreach (System.IO.FileInfo file in directory.GetFiles())
        {
            if (file.Extension == ".xml")
            {
                xdoc.Root.Add(XDocument.Load(file.FullName).Root.Elements());
            }
        }
    }

    return xdoc;
}

3

实际上,在实践中,XDocumentXMLDocument并不是非此即彼的关系(除非你使用Silverlight)- 所以如果XMLDocument有你需要的功能而XDocument没有,那么也许可以使用XMLDocument(例如使用ImportNode等)。

话虽如此,即使在使用XDocument时,你也可以使用XNode.ReadFrom导入每个文档,然后简单地将其.Add到主集合中。

当然,如果文件很大,XmlReader/XmlWriter可能更有效率...但更复杂。幸运的是,XmlWriter有一个接受XmlReaderWriteNode方法,所以你可以导航到XmlReader中的第一个子元素,然后将其直接写入输出文件。类似于:

    static void AppendChildren(this XmlWriter writer, string path)
    {
        using (XmlReader reader = XmlReader.Create(path))
        {
            reader.MoveToContent();
            int targetDepth = reader.Depth + 1;
            if(reader.Read()) {
                while (reader.Depth == targetDepth)
                {
                    writer.WriteNode(reader, true);
                }                
            }
        }
    }

1
非常感谢 :) 我想我已经找到了一些可以用更少代码实现的东西。 - Larry

0
作为一种解决方法,您可以使用XSL文件合并XML文件,然后将其转换为XDocument对象。

1
谢谢。很抱歉,我讨厌XSL。我肯定更喜欢基于C#代码的解决方案。 - Larry
没问题,我理解避免使用XSL有时可能会非常令人困惑。 - schnaader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接