我有几个xml文件。它们都具有相同的结构,但由于文件大小而被拆分。所以,假设我有A.xml
,B.xml
,C.xml
和D.xml
,并希望使用命令行工具将它们合并/合并到combined.xml
。< / p>
A.XML
<products>
<product id="1234"></product>
...
</products>
B.XML
<products>
<product id="5678"></product>
...
</products>
等
答案 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)
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
products
)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>