3

タイトルが紛らわしくてすみません。2 つの XML ファイルを比較する Python スクリプトを作成しています。両方のファイルに、ID が他のファイルのものと等しいデータがあります。

例えば

ソースファイル:

  <id>123456</id> 
    <data>blabla</data>
        ......some other data......
  <id>abcde</id>
    <data>gfkgjk</data>
        ......some more data..........

対象ファイル:

  <id>123456</id> 
    <data> </data>
        ......some other data......
  <id>ghijk</id>
    <data>gfkgjk</data>
        ......some more data..........

上記の例からわかるように、ソース ファイルにあるすべての ID がターゲット ファイルにもあるわけではありません。さらに、2 つのデータ グループに同じ ID がありますが、一方には「データ」タグが記入されており、もう一方には記入されていません。

私のプログラムは、ソースファイルを見て、id とデータタグ間のテキストを抽出することになっています。次に、ターゲット ファイルを調べて、同じ ID と空のデータ タグ (上記の例のように) を持つデータがある場合、これらの空のタグにソース ファイルからの情報を入力します。(ちなみに、ID とデータ情報を除けば、2 つの XML はまったく異なるため、ソース ファイルだけを保持することはできません)。

そうです、データ タグ間の ID と情報を抽出できました。今、ID を比較し、空のデータ情報がある場合はそれを置き換える関数を作成しようとしています。ただし、私は Python と関数にあまり詳しくないので、助けが必要です。私の関数は次のようになります。

def replace_empty_data():
    for x in xmlData_id_source:
       if xmlData_id_source==xmlData_id_target:
          target = re.sub(xmlData_2,xmlData,target)
       return target
    file_target.close()

関数に欠落している負荷がある可能性がありますが、何がわかりません。エラーは発生せず、単に機能していません。x 以外の変数はコードの前の部分で定義されているため、これは問題ではありません。

xmlData_id_source はソース ファイルの ID です xmlData_id_target はターゲット ファイルの ID です xmlData_2 はターゲット ファイルのデータ情報です xmlData はソース ファイルのデータ情報です

これまでの入力に感謝しますが、プログラミングについて何も知らない人にとってわかりやすい方法をまだ探しています....ファイルの解析にminidomを使用し、インポートおよびインストールせずに使用したいと思いますさらなるライブラリ。

4

2 に答える 2

2

これには XML パーサーを使用する必要があります。ElementTreeを見てください。

ここでは、正規表現や文字列置換を使用しないでください

于 2012-07-13T13:41:09.973 に答える
1

私はlxmlを使用します。これは、優れたパフォーマンスと、組み込みの ElementTree がサポートしていない XPATH などの追加機能を備えています。これが私がすることです:

>>> source = """<root>
    <tag>
        <id>123456</id> 
        <data>blabla</data>
    </tag>
    <tag>
        <id>abcde</id>
        <data>gfkgjk</data>
    </tag>
</root>"""
>>> target = """<root>
    <tag>
        <id>123456</id> 
        <data> </data>
    </tag>
    <tag>
        <id>ghijk</id>
        <data>gfkgjk</data>
    </tag>
</root>"""

dataノードは1つにカプセル化されていないため、id両方が1つにあると想定しましtagた。これはroot. idわかりました、最初の部分はs とそれに対応するdict を取得することを目的としていdataます:

>>> root = etree.fromstring(source)
>>> for tag in root.findall('tag'):
    id_ = tag.find('id')
    data = tag.find('data')
    id_dict[id_.text] = data.text


>>> id_dict
{'123456': 'blabla', 'abcde': 'gfkgjk'}

次に、この辞書のおかげでターゲットを更新します。

>>> root = etree.fromstring(target)
>>> for tag in root.findall('tag'):
    id_ = tag.find('id')
    data = tag.find('data')
    if data.text.strip() == '':
        data.text = id_dict[id_.text]


>>> print etree.tostring(root)
<root>
    <tag>
        <id>123456</id> 
        <data>blabla</data>
    </tag>
    <tag>
        <id>ghijk</id>
        <data>gfkgjk</data>
    </tag>
</root>

そのソリューションを実際の XML 構造に適応させるだけでよいのです。

于 2012-07-13T14:08:15.803 に答える