我试图将几个 XML 文件合并成一个 XDocument 对象。
XDocument 对象中不存在合并功能,我很遗憾。
是否已经有人实现了 XDocument 的合并扩展方法或类似的东西?
我试图将几个 XML 文件合并成一个 XDocument 对象。
XDocument 对象中不存在合并功能,我很遗憾。
是否已经有人实现了 XDocument 的合并扩展方法或类似的东西?
我自己也尝试了一下:
var MyDoc = XDocument.Load("File1.xml");
MyDoc.Root.Add(XDocument.Load("File2.xml").Root.Elements());
我不知道这是好还是坏,但对我而言它很有效 :-)
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;
}
实际上,在实践中,XDocument
和XMLDocument
并不是非此即彼的关系(除非你使用Silverlight)- 所以如果XMLDocument
有你需要的功能而XDocument
没有,那么也许可以使用XMLDocument
(例如使用ImportNode
等)。
话虽如此,即使在使用XDocument
时,你也可以使用XNode.ReadFrom
导入每个文档,然后简单地将其.Add
到主集合中。
当然,如果文件很大,XmlReader/XmlWriter
可能更有效率...但更复杂。幸运的是,XmlWriter
有一个接受XmlReader
的WriteNode
方法,所以你可以导航到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);
}
}
}
}