Объединение нескольких файлов 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
будет уничтожено, а не будет включено.
Каждый из этих ограничений можно обойти, но не все из них легко.