Объединить несколько файлов XML из командной строки - PullRequest
14 голосов
/ 25 января 2012

У меня есть несколько 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>

и т.д.

Ответы [ 3 ]

15 голосов
/ 03 июля 2012

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

Сохраните этот скрипт Python как 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

  • xmlcombine.py *.xml | sponge combined.xml: Собирает все также в combined.xml, но требует программу sponge

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

7 голосов
/ 29 июня 2014

xml_grep

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

xml_grep --pretty_print с отступом - упаковка продуктов --descr '' --cond "product" * .xml> комбинированный.xml

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

Простой технический ответ:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...