Объединение нескольких файлов XML из командной строки

У меня есть несколько xml файлов. Все они имеют одинаковую структуру, но были разделены из-за размера файла. Итак, скажем, у меня есть A.xml, B.xml, C.xml и D.xml и вы хотите объединить/объединить их с combined.xml, используя инструмент командной строки.

a.xml

<products>
    <product id="1234"></product>
    ...
</products>

B.xml

<products>
  <product id="5678"></product>
  ...
</products>

и др.

Ответ 1

Высокотехнологичный ответ:

Сохраните этот Python script как xmlcombine.py:

#!/usr/bin/env python
import sys
from xml.etree import ElementTree

def run(files):
    first = None
    for filename in files:
        data = ElementTree.parse(filename).getroot()
        if first is None:
            first = data
        else:
            first.extend(data)
    if first is not None:
        print ElementTree.tostring(first)

if __name__ == "__main__":
    run(sys.argv[1:])

Чтобы объединить файлы, запустите:

python xmlcombine.py ?.xml > combined.xml

Для дальнейшего улучшения рассмотрите возможность использования:

  • chmod +x xmlcombine.py: Позволяет пропустить python в командной строке

  • xmlcombine.py !(combined).xml > combined.xml: Собирает все файлы XML, кроме вывода, но требует bash extglob option

  • xmlcombine.py *.xml | sponge combined.xml: Собирает все в combined.xml, но требует sponge program

  • import lxml.etree as ElementTree: Использует потенциально более быстрый XML-парсер

Ответ 2

xml_grep

http://search.cpan.org/dist/XML-Twig/tools/xml_grep/xml_grep

xml_grep --pretty_print с отступом --wrap -descr '' --cond "product" *.xml > mixed.xml

  • - wrap: заключает/завершает результат xml с данным тегом. (здесь: products)
  • - cond: поддерево xml для grep (здесь: product)

Ответ 3

Низкотехнологичный простой ответ:

echo '<products>' > combined.xml
grep -vh '</\?products>\|<?xml' *.xml >> combined.xml
echo '</products>' >> combined.xml

Ограничения:

  • Теги открытия и закрытия должны быть в отдельной строке.
  • Файлы должны иметь одинаковые внешние теги.
  • Внешние теги не должны иметь атрибутов.
  • У файлов не должно быть внутренних тегов, соответствующих внешним тегам.
  • Любое текущее содержимое combined.xml будет уничтожено, а не будет включено.

Каждый из этих ограничений можно обойти, но не все из них легко.