Как объединить xml файлы в один

Обновлено: 06.07.2024

Короче, ситуация: есть очень много (несколько тысяч) однотипных .xml файлов со структурой, как в прикрепленном примере. Структура везде и всегда одна и та же.

Нужно их всех слепить в один полноценный файл.xml Но при этом, удалить из всех файлов в процессе сбора (так чтобы в итоговом не было) некоторые теги. Далее файл должен нормально читаться Exel.

При этом сделать нужно при помощи наиболее универсального (читай - легко редактируемого) средства - то есть как вариант на скрипте CMD, WSH/PoSH, и т.п.

ИЛИ - нужно свести некоторые данные (теги) из всех файлов в одну таблицу (любого читаемого простыми средствами Окон формата).

По дурости своей и ностальгии решил замутить все на обычном CMD, но застрял в процессе: как замутить чтение только части файла, откидывая сразу заголовки:

Есть и более простое решение: поместить все в тег <root>, но не уверен, что Exel переварит такой файл.

А как удалить по маске содержимое тега вместе с ним на голом CMD - вообще не знаю.

Решил смотреть в сторону разпарсинга кучи этих xml в таблицу на PowerShell, о в котором я страшный нубище)))

Накурил такой вот код:

Ну что-то не покатило - ибо как вариант очень вероятный - я натупил.

Во общем прошу помощи в решении! Ибо задача срочная и очень объемная.

Я бы всё-таки не стал это делать на скрипте, так как, судя по размеру и количеству файлов, такой скрипт будет выполняться до конца света. Самым быстрым с точки зрения выполнения конечно же является компилируемая программа, которая просто открывает файлы, как текстовые, ищет по ключевым тегам и прямо кусками, не распаршивая весь остальной контент, вставляет текст в итоговый большой файл. Но тут, конечно же, потребуются знания в программировании.

Ребята выручайте, надо объединить несколько файлов xml в один. Уже весь интернет "перерыл", но так и не нашёл ответа. Нашёл прогу которая сравнивает два файла (winmerge называется) и делает их одинаковыми (возможно я не нашёл как переносить данные с одного файла в другой), но мне надо добавить в один. Подскажите как это сделать.

п.с. я не программист

Файлы нужно просто склеить или требуется интеллектуальная обработка данных?
Если просто склеить, то склеивать умеет даже простая консольная команда copy (посмотри синтаксис, использующий плюс).
Если же обычной склейки недостаточно, то нужно уже писать программу, здесь ничего не поделаешь. В файлах хранится информация от одного сайта. Недавно я сбрасывал систему и не сохранил файлы, так как думал на сервере инфа останется. Оказалось что нет. Мне восстановили файлы и теперь мне надо их скрепить. Восстановленные файлы я открывал на компе, вроде с виду такие же как и должны быть. Я так понимаю надо только скрепить. Попробую тем что ты посоветовал, но я вообще не программёр, даже блокнотом никогда не пользовался. Вообщем попробую - если что отпишусь. Не, я в этом не разберусь. Синтаксис да ещё на английском. Попроще ничё нет? Может какой-то редактор? Да что там разбираться. Если есть файл file1.xml и file2.xml, и нужно их слить и записать результат в файл file_all.xml, то нужно написать следующую команду в командной строке: Если файлов больше, то их можно добавлять в первый параметр через дополнительные плюсы.

Простое склеивание текстовых файлов в один здесь не подойдёт.
Сводный XML-файл должен иметь примерно такую структуру.

</root>[/HTML]Для этого нужно будет написать небольшой скрипт, который будет делать следующее:
- создать выходной XML-файл с заголовочной строкой и пустым корневым тегом.
- найти в указанном каталоге все файлы с расширением .XML, в итоге должен получиться список имён файлов.
- циклом поочерёдно открывать каждый исходный XML-файл и парсером читать данные из его корневого тега.
- добавлять в выходной XML-файл полученные данные в виде дочерних тегов (желательно присваивать каждому тегу уникальное имя).

у меня есть два xml-файла, которые имеют одинаковую схему, и я хотел бы объединить в один xml-файл. Существует ли простой способ сделать это?

= новый файл, содержащий

Для справки (и дать представление о сложности) вот пример с открытым исходным кодом из Java world:XML-файле слияние сделано легко

вернемся к исходному вопросу. В спецификации задачи мало больших серых областей: когда следует учитывать 2 элемента эквивалентно (имеют одинаковое имя, совпадающие выбранные или все атрибуты, или также имеют одинаковую позицию в родительском элементе); как обрабатывать ситуацию, когда исходный или объединенный XML имеют несколько эквивалентно элементы etc.

код ниже предполагает, что

  • мы только заботьтесь об элементах на данный момент
  • элементы эквивалентно если имена элементов, имена атрибутов и значения атрибутов совпадают
  • элемент не имеет несколько атрибутов с одинаковым именем
  • все эквивалентно элементы из Объединенного документа будут объединены с первым эквивалентным элементом в исходном XML-документе.

Он будет производить желаемого результата с исходные фрагменты XML, но если входные XMLs более сложны и имеют повторяющиеся элементы, результат будет больше. интересно:

вот объединенный документ, показывающий, как эквивалентно элементы из документа B были объединены:

Если формат всегда точно такой, в этом методе нет ничего плохого:

удалите последние две строки из первого файла и добавьте вторые файлы при удалении первых двух строк.

посмотрите на команды Linux head и tail который может удалить первую и последние две строки.

Это простое преобразование XSLT что-то вроде этого (которое вы применяете к документу a.xml):

vimdiff file_a file_b приведу лишь один пример:

сценарий пошел по строкам этого:

и MergeNodes() выглядело примерно так:

его не идеально - я должен вручную указать узлы, которые я хочу объединить, но это было быстро и легко для меня, чтобы собрать и так как у меня есть почти не знаю XML, я счастлив:)

на самом деле лучше, что он объединяет только указанные узлы, так как я использую его для слияния edmx-файлов Entity Framework, и я действительно хочу объединить ssdl, CDSL и MSL-узлы.

способ, которым вы могли бы это сделать, - загрузить набор данных с xml и объединить наборы данных.

Если у меня есть две строки xml1 и xml2, которые представляют xml в одном формате. Как быстрее всего их объединить? Формат не важен, но я просто хочу знать, как мне избавиться или?

И получится что-то вроде этого:

Самый простой способ сделать это - использовать LINQ to XML. Вы можете использовать либо Union, либо Concat в зависимости от ваших потребностей.

Преобразование XSLT могло сделать это:

Передайте имена файлов в качестве параметров, а также имя нового корневого элемента.

Применить к любому XML-документу, например пустой.

Это самый быстрый и чистый способ объединить файлы xml.

Если вы хотите использовать XmlDocument, попробуйте это

Если вы можете гарантировать этот формат, вы можете комбинировать их, выполняя манипуляции со строками:

  • Прочтите первый файл, сохраните все до " "
  • Прочтите второй файл, удалите часть до ""
  • Объедините эти струны.

Это должен быть самый быстрый способ, поскольку синтаксический анализ не требуется.

Тем не менее, я всегда предпочел бы безопасный путь быстрому пути.

У вас есть два основных варианта:

Разберите xml, объедините структуры данных, сериализуйте обратно в xml.

Если вы знаете структуру, воспользуйтесь простыми манипуляциями со строкой, чтобы взломать ее. Например, в приведенном выше примере вы можете взять внутреннюю часть всех узлов в двух блоках xml и поместить их в один блок allnodes, и все готово.

Лучшее решение для меня, основанное на ответе Хосе Базилио, слегка измененном,

Затем сериализуйте второй класс обратно из XML, и он должен выглядеть как ваш третий пример.

Поскольку вы запросили самый быстрый :

Если (и только если) структура xml всегда согласована: (это псевдокод)

Это гигантский взлом, но он быстрый. Ожидайте увидеть это на TheDailyWTF, когда ваши коллеги найдут его.

В моем случае основное решение не сработало , разница заключалась в том, что у меня был список для тысяч файлов, когда я беру один элемент и пытаюсь объединиться с первым элементом. Я получаю исключение OutOfMemory, я добавил пустой шаблон с пустой строкой (в данном случае NodeA) , чтобы решить странную проблему с памятью и работать без сбоев.

В идеале хотелось бы объединить 2 строки в одну, с суммированием значений в столбце "value", т.е. сделать из получасовых данных - часовые (24 за сутки)

В идеале хотелось бы объединить 2 строки в одну, с суммированием значений в столбце "value", т.е. сделать из получасовых данных - часовые (24 за сутки) meiv

В идеале хотелось бы объединить 2 строки в одну, с суммированием значений в столбце "value", т.е. сделать из получасовых данных - часовые (24 за сутки) Автор - meiv
Дата добавления - 29.04.2015 в 12:51

Дальше в сводной делаете нужный вам отчет.

Дальше в сводной делаете нужный вам отчет. SLAVICK

Иногда все проще чем кажется с первого взгляда.

Дальше в сводной делаете нужный вам отчет. Автор - SLAVICK
Дата добавления - 29.04.2015 в 15:26

SLAVICK
Спасибо, все работает!
Простите за мою лень, а можно сделать так чтобы собирал сразу за год на отдельные листочки, а не по одному месяцу?
И перевести получас в час.


AndreTM
файл именно тот, точнее это один из файлов с которых нужно собрать данные. Прикладываю архив с каталогами.

SLAVICK
Спасибо, все работает!
Простите за мою лень, а можно сделать так чтобы собирал сразу за год на отдельные листочки, а не по одному месяцу?
И перевести получас в час.


AndreTM
файл именно тот, точнее это один из файлов с которых нужно собрать данные. Прикладываю архив с каталогами. meiv


AndreTM
файл именно тот, точнее это один из файлов с которых нужно собрать данные. Прикладываю архив с каталогами. Автор - meiv
Дата добавления - 30.04.2015 в 06:09

Можно, но зачем?
У Вас все данные будут собраны на один лист - дальше можно легко добавить нужные формулы(если нужно) и сделать сводную за весь период сразу А дальше из нее делать нужные отчеты.
Если данные будут на разных листах - то будет сложнее делать итоговые отчеты.

Может Вы имели ввиду сразу со всех подпапок? - можно допилить макрос, но можно просто в папку ХML скинуть сразу все файлы с всех месяцев - они же названы по разному.

Сделайте краткий пример того что-бы Вы хотели получить в итоге. А дальше будет видно.

Макрос просто собирает информацию с Ваших файлов - ничего не переделывает. Можно сделать сводную на основе полученных данных - и ее привести в тот вид, который нужно.

ЗЫ
Я ответить смогу только после 5-го числа - праздники на носу

Можно, но зачем?
У Вас все данные будут собраны на один лист - дальше можно легко добавить нужные формулы(если нужно) и сделать сводную за весь период сразу А дальше из нее делать нужные отчеты.
Если данные будут на разных листах - то будет сложнее делать итоговые отчеты.

Может Вы имели ввиду сразу со всех подпапок? - можно допилить макрос, но можно просто в папку ХML скинуть сразу все файлы с всех месяцев - они же названы по разному.

Сделайте краткий пример того что-бы Вы хотели получить в итоге. А дальше будет видно.

Макрос просто собирает информацию с Ваших файлов - ничего не переделывает. Можно сделать сводную на основе полученных данных - и ее привести в тот вид, который нужно.

ЗЫ
Я ответить смогу только после 5-го числа - праздники на носу SLAVICK

Иногда все проще чем кажется с первого взгляда.

Может Вы имели ввиду сразу со всех подпапок? - можно допилить макрос, но можно просто в папку ХML скинуть сразу все файлы с всех месяцев - они же названы по разному.

Сделайте краткий пример того что-бы Вы хотели получить в итоге. А дальше будет видно.

Макрос просто собирает информацию с Ваших файлов - ничего не переделывает. Можно сделать сводную на основе полученных данных - и ее привести в тот вид, который нужно.

ЗЫ
Я ответить смогу только после 5-го числа - праздники на носу Автор - SLAVICK
Дата добавления - 30.04.2015 в 18:29

Если у меня есть две строки xml1 и xml2, которые оба представляют xml в том же формате. Каков самый быстрый способ объединить их? Формат не важен, но я просто хочу знать, как я могу избавиться или?

и что-то вроде этого:

ОТВЕТЫ

Ответ 1

Самый простой способ сделать это - использовать LINQ to XML. Вы можете использовать Union или Concat в зависимости от ваших потребностей.

Ответ 2

Преобразование XSLT могло бы сделать это:

Передайте имена файлов в качестве параметров, а также имя нового корневого элемента.

Применить к любому XML-документу, например. пустой.

Ответ 3

Это самый быстрый и чистый способ слияния XML файлов.

Ответ 4

Если вы можете гарантировать этот формат, вы можете объединить их, выполнив строковые манипуляции:

  • Прочитайте первый файл, сохраните все до "</AllNodes> "
  • Прочитайте второй файл, удалите часть до "<AllNodes> "
  • Объедините эти строки.

Это должно быть самым быстрым способом, поскольку не требуется синтаксический анализ.

Это говорит, что я всегда предпочитаю безопасный путь к быстрому пути.

Ответ 5

У вас есть два основных варианта:

Разберите xml, объедините структуры данных, сериализуйте обратно в xml.

Если вы знаете структуру, используйте некоторые основные манипуляции с строкой, чтобы взломать ее. Например, в приведенном выше примере вы можете взять внутри allnodes в двух блоках xml и поместить их в один блок allnodes и сделать.

Ответ 6

Если вы хотите использовать XmlDocument, попробуйте это

Ответ 7

Лучшее решение для меня, основано на ответе Хосе Базилио, слегка изменено,

Ответ 8

Затем сериализуйте второй класс обратно из XML, и он должен выглядеть как ваш третий пример.

Ответ 9

Поскольку вы запрашивали самый быстрый:

Если (и только если) структура xml всегда согласована: (это псевдокод)

Это гигантский взлом, но он быстро. Ожидайте увидеть его на TheDailyWTF, когда ваши коллеги найдут его.

Читайте также: