从命令行合并多个XML文件

时间:2012-01-25 14:16:30

标签: xml command-line merge

我有几个xml文件。它们都具有相同的结构,但由于文件大小而被拆分。所以,假设我有A.xmlB.xmlC.xmlD.xml,并希望使用命令行工具将它们合并/合并到combined.xml。< / p>

A.XML

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

B.XML

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

4 个答案:

答案 0 :(得分:14)

高科技答案:

将此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解析器

答案 1 :(得分:6)

xml_grep

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

  

xml_grep --pretty_print indented --wrap products --descr&#39;&#39; - 条件   &#34;产品&#34; * .xml&gt; combined.xml

  • - wrap:使用给定标记封装/包装xml结果。 (此处:products
  • - cond:grep的xml子树(此处:product

答案 2 :(得分:0)

低技术简单回答:

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

限制:

  • 开始和结束标签需要在他们自己的行上。
  • 文件需要具有相同的外部标签。
  • 外部代码不得包含属性。
  • 文件不得包含与外部标记匹配的内部标记。
  • combined.xml的所有当前内容都将被删除,而不是被包含在内。

这些限制中的每一个都可以解决,但不是很容易解决所有这些限制。

答案 3 :(得分:0)

合并 2 棵树包括识别哪些是相同的以及哪些应该被替换的任务。不幸的是,这并不明显。所涉及的语义比从源 XML 文档推断的更多。

考虑这样一种情况,第一个文档有一个中间层,其中几个元素具有相同的标签,但属性不同。第二个文档向现有元素添加了该中间级别的属性,但也向它添加了另一个子元素。必须知道语义。

<params>
...
<param><name>hello</name><value>world</value></param>
...
</params>

添加/合并:

<params>
   <param><name>hello</name><value>yellow submarine</value></param>
</params>