如果第二个文件中包含标记,则使用python合并两个xml文件

时间:2015-04-11 21:11:15

标签: python xml merge

假设我们有以下xml文件:

file1.xml:

<main>
<tag1 name="name1">
    <t1>text1</t1>
    <t2></t2>
    <t3></t3>
    <t4></t4>
    <t5>text5</t5>
    <t6>text6</t6>
</tag1>
</main>

file2.xml:

<main>
<tag1 name="name1">
    <t1>text1</t1>
    <t2></t2>
    <t3></t3>
    <t4>text4</t4>
    <t5>text5</t5>
    <t6>text6</t6>
    <t7>text7</t7>
    <t8></t8>
</tag1>
</main>

对于file1和file2中具有相同名称属性的每个tag1标记,我想生成第三个文件,其中包含file1的所有tx标记以及file2中不在file1中的tx标记,还加上textx内容file2而不是file1,即使两者都存在相应的tx标签。我想用python做这个。请查看下面的file_out.xml以便更好地理解

file_out.xml:

<main>
<tag1 name="name1">
    <t1>text1</t1>
    <t2></t2>
    <t3></t3>
    <t4>text4</t4>
    <t5>text5</t5>
    <t6>text6</t6>
    <t7>text7</t7>
    <t8></t8>
</tag1>
</main>

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,我提出的问题没有任何代码片段,因为我是XML解析和Python的新手。请注意,在我放的XML示例中,tag1实际上是游戏,所以这就是我解决它的方法:

import xml.etree.ElementTree as ET
import sys, os

file1_path = sys.argv[1]
file2_path = sys.argv[2]
file_out_path = sys.argv[3]

if os.path.exists(file_out_path):
    os.remove(file_out_path)

tree1 = ET.parse(file1_path)
root1 = tree1.getroot()

tree2 = ET.parse(file2_path)
root2 = tree2.getroot()

for game2 in root2.iter ('game'):
    name2 = game2.get('name')
    found = False
    for game1 in root1.iter ('game'):
        name1 = game1.get('name')
        if name1 == name2:
            found = True
            break
    if not found:
        root1.append(game2)

#######################

for game1 in root1.iter ('game'):
    name1 = game1.get('name')
    for game2 in root2.iter('game'):
        name2 = game2.get('name')
        if name1 == name2:
            for tag2 in game2:
                tag1 = game1.find(tag2.tag)
                if tag1 is None:
                    game1.append(tag2)
                else:
                    if (tag1.text is None) or (tag1.text is " ") or (tag1.text is ""):
                        tag1.text = tag2.text

################################

tree1.write(file_out_path, method='html')
sys.exit(0)