【问题标题】:merging xml files using python's ElementTree使用 python 的 ElementTree 合并 xml 文件
【发布时间】:2013-04-02 01:06:22
【问题描述】:

我需要在 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 分配给具有标题等的数据,然后使用“结果”进行扩展。但是,这给了我这个:

<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>

结果需要位于底部的位置。任何帮助将不胜感激。

【问题讨论】:

  • 我的问题可能重复:stackoverflow.com/questions/14878706/…
  • 您的示例 XML 文件格式错误,是的,它是重复文件
  • 为什么它们格式不正确?
  • 不是有效的 xml。无论如何,这是一个重复的问题,所以请阅读其中的答案。

标签: python xml merge


【解决方案1】:

你可以试试这个解决方案:

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

【讨论】:

    【解决方案2】:

    虽然这大部分是重复的,答案可以在 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>
    

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多