11

xml の 3 番目のブロックで 2 つの 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>

結果が一番下にある必要があります。どんな助けでも大歓迎です。

4

2 に答える 2

12

これはほとんどが重複しており、答えはここにありますが、私はすでにこれを行っているので、この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>
于 2013-04-10T09:43:40.160 に答える
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

于 2019-04-24T10:16:08.710 に答える