Ответ 1
Я пробовал немного:
var MyDoc = XDocument.Load("File1.xml");
MyDoc.Root.Add(XDocument.Load("File2.xml").Root.Elements());
Я не знаю, хорошо это или плохо, но он отлично работает для меня: -)
Я пытаюсь объединить несколько XML файлов в один объект XDocument.
Слияние не существует в объекте XDocument. Я пропустил это.
Кто-нибудь уже реализовал метод расширения Merge для XDocument или что-то подобное?
Я пробовал немного:
var MyDoc = XDocument.Load("File1.xml");
MyDoc.Root.Add(XDocument.Load("File2.xml").Root.Elements());
Я не знаю, хорошо это или плохо, но он отлично работает для меня: -)
Будучи прагматичным, 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);
}
}
}
}
Объединить все 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.