2008-11-11 82 views
14

我想在单个XDocument对象中合并几个XML文件。合并XDocument中的XML文件

合并在XDocument对象中不存在。我想念这个。

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

回答

24

我尝试了一下自己:

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

我不知道是好还是坏,但它工作正常,我:-)

0

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

+1

谢谢。对不起,我讨厌XSL。我肯定会更喜欢基于C#代码的解决方案。 – Larry 2008-11-11 08:24:26

+0

没问题,我了解XSL避免,因为它有时可能会非常混乱。 – schnaader 2008-11-11 08:32:32

3

务实,XDocument VS XmLDocument并非全有或全无(除非你是Silverlight的) - 所以,如果XmlDoucument做你需要的东西,而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); 
       }     
      } 
     } 
    } 
3

合并所有XML文件from dir to one 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; 
}