Объединить XML-файлы в XDocument - PullRequest
14 голосов
/ 11 ноября 2008

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

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

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

Ответы [ 4 ]

24 голосов
/ 11 ноября 2008

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

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

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

3 голосов
/ 12 января 2015

Объединение всех 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;
}
3 голосов
/ 11 ноября 2008

Будучи прагматичным, XDocument против XmLDocument - это не все или ничего (если вы не используете Silverlight) - поэтому, если XmlDoucument делает то, что вам нужно, а XDocument - нет, тогда, возможно, используйте XmlDocumentImportNode и т. Д.).

Тем не менее, даже с 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);
                }                
            }
        }
    }
0 голосов
/ 11 ноября 2008

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

...