English 中文(简体)
将 XML 文件合并在 XDocument 中
原标题:
  • 时间:2008-11-11 08:14:55
  •  标签:

我正在尝试将多个XML文件合并为单个XDocument对象。

在XDocument对象中不存在Merge。我很想念这个功能。

有人已经为XDocument实现了Merge扩展方法或类似的东西吗?

最佳回答

我自己试过一点

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

我不知道它是好是坏,但是对我来说它很好用 :-)

问题回答

实际上,XDocumentXmlDocument不是非此即彼的(除非你使用Silverlight)- 因此,如果XmlDocument可以做你需要的事情,而XDocument不能,那么也许可以使用XmlDocument(带有ImportNode等)。

话虽如此,即使是使用 XDocument,你也可以假定地使用 XNode.ReadFrom 导入每个节点,然后将其简单地 .Add 到主集合中。

当然,如果文件很大,XmlReader / XmlWriter可能更效率更高...但更复杂。幸运的是,XmlWriter有一个WriteNode方法可以接受一个XmlReader,因此您可以导航到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);
                }                
            }
        }
    }

将dir中的所有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;
}

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





相关问题
热门标签