Я пытаюсь объединить несколько файлов XML в один объект XDocument.
Слияние не существует в объекте XDocument. Я упустил это.
Кто-нибудь уже реализовал метод расширения Merge для XDocument или что-то подобное?





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