Слияние файлов XML в XDocument

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
0
12 745
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Спасибо. Извините, я ненавижу XSL. Я определенно предпочел бы решение на основе кода C#.

Larry 11.11.2008 11:24

Нет проблем, я понимаю, что избегание XSL иногда может сбивать с толку.

schnaader 11.11.2008 11:32

Будучи прагматичным, 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);
                }                
            }
        }
    }

Большое спасибо :) Я думаю, что нашел что-то, что работает с меньшим количеством кода.

Larry 11.11.2008 13:29
Ответ принят как подходящий

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

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;
}

Другие вопросы по теме