Объединение XML файлов в XDocument

Я пытаюсь объединить несколько XML файлов в один объект XDocument.

Слияние не существует в объекте XDocument. Я пропустил это.

Кто-нибудь уже реализовал метод расширения Merge для XDocument или что-то подобное?

Ответы

Ответ 1

Я пробовал немного:

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

Я не знаю, хорошо это или плохо, но он отлично работает для меня: -)

Ответ 2

Будучи прагматичным, 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 файлы из каталога в один 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;
}

Ответ 4

В качестве обходного пути вы можете использовать XSL файл для объединения файлов XML, а затем преобразовать его в объект XDocument.