我需要在xml的第三个块上合并两个xml文件。因此,文件A.xml和B.xml看起来像这样:
A.XML
<sample id="1">
<workflow value="x" version="1"/>
<results>
<result type="T">
<result_data type="value" value="19"/>
<result_data type="value" value="15"/>
<result_data type="value" value="14"/>
<result_data type="value" value="13"/>
<result_data type="value" value="12"/>
</result>
</results>
</sample>
B.XML
<sample id="1">
<workflow value="x" version="1"/>
<results>
<result type="Q">
<result_data type="value" value="11"/>
<result_data type="value" value="21"/>
<result_data type="value" value="13"/>
<result_data type="value" value="12"/>
<result_data type="value" value="15"/>
</result>
</results>
</sample>
我需要合并'结果'
<sample id="1">
<workflow value="x" version="1"/>
<results>
<result type="T">
<result_data type="value" value="19"/>
<result_data type="value" value="15"/>
<result_data type="value" value="14"/>
<result_data type="value" value="13"/>
<result_data type="value" value="12"/>
</result>
<result type="Q">
<result_data type="value" value="11"/>
<result_data type="value" value="21"/>
<result_data type="value" value="13"/>
<result_data type="value" value="12"/>
<result_data type="value" value="15"/>
</result>
</results>
</sample>
到目前为止,我所做的是:
import os, os.path, sys
import glob
from xml.etree import ElementTree
def run(files):
xml_files = glob.glob(files +"/*.xml")
xml_element_tree = None
for xml_file in xml_files:
# get root
data = ElementTree.parse(xml_file).getroot()
# print ElementTree.tostring(data)
for result in data.iter('result'):
if xml_element_tree is None:
xml_element_tree = data
else:
xml_element_tree.extend(result)
if xml_element_tree is not None:
print ElementTree.tostring(xml_element_tree)
如您所见,我将初始xml_element_tree分配给具有标题等的数据,然后使用'result'进行扩展。但是,这给了我这个:
<sample id="1">
<workflow value="x" version="1"/>
<results>
<result type="T">
<result_data type="value" value="19"/>
<result_data type="value" value="15"/>
<result_data type="value" value="14"/>
<result_data type="value" value="13"/>
<result_data type="value" value="12"/>
</result>
</results>
<result_data type="value" value="11"/>
<result_data type="value" value="21"/>
<result_data type="value" value="13"/>
<result_data type="value" value="12"/>
<result_data type="value" value="15"/>
</result>
</sample>
结果需要在底部。任何帮助将不胜感激。
答案 0 :(得分:5)
虽然这大部分是重复的,并且可以找到答案here,但我已经这样做了,所以我可以分享这个python代码:
import os, os.path, sys
import glob
from xml.etree import ElementTree
def run(files):
xml_files = glob.glob(files +"/*.xml")
xml_element_tree = None
for xml_file in xml_files:
data = ElementTree.parse(xml_file).getroot()
# print ElementTree.tostring(data)
for result in data.iter('results'):
if xml_element_tree is None:
xml_element_tree = data
insertion_point = xml_element_tree.findall("./results")[0]
else:
insertion_point.extend(result)
if xml_element_tree is not None:
print ElementTree.tostring(xml_element_tree)
然而,这个问题包含另一篇文章中没有的另一个问题。示例XML文件不是有效的XML,因此无法使用XML标记:
<sample="1">
...
</sample>
不可能改为:
<sample id="1">
...
</sample>
答案 1 :(得分:0)
您可以尝试以下解决方案:
import glob
from xml.etree import ElementTree
def newRunRun(folder):
xml_files = glob.glob(folder+"/*.xml")
node = None
for xmlFile in xml_files:
tree = ElementTree.parse(xmlFile)
root = tree.getroot()
if node is None:
node = root
else:
elements = root.find("./results")
for element in elements._children:
node[1].append(element)
print ElementTree.tostring(node)
folder = "resources"
newRunRun(folder)
如您所见,我正在使用第一个文档作为容器,在其中插入其他文档的元素...这是生成的输出:
<sample id="1">
<workflow value="x" version="1" />
<results>
<result type="Q">
<result_data type="value" value="11" />
<result_data type="value" value="21" />
<result_data type="value" value="13" />
<result_data type="value" value="12" />
<result_data type="value" value="15" />
</result>
<result type="T">
<result_data type="value" value="19" />
<result_data type="value" value="15" />
<result_data type="value" value="14" />
<result_data type="value" value="13" />
<result_data type="value" value="12" />
</result>
</results>
</sample>
使用版本: Python 2.7.15