PythonElementTree将两个XML文件与第一个XML文件的命名空间合并

2024-06-26 14:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

请注意,我正试图用名称空间和根解析我的“default_values.xml”。然后我想用另一个xml文件的根扩展“defaul_values.xml”的根,它的名称是“test_values.xml”,并将组合的xml写入“final_values.xml”文件

到目前为止,我做了扩展(或合并)过程,但在“final.xml”文件中的名称空间上有问题。我的Python代码没有像我所希望的那样编写名称空间。这是xml文件和代码,也是我想在最后一步创建的xml文件:

“default\u values.xml”

<?xml version="1.0" encoding="UTF-8"?>
<myMainRoot xmlns:ns1="http://www.examplenamespace1.com/v123#"
    xmlns:ns2="http://www.examplenamespace2.com/v123#"
    xmlns:ns3="http://www.examplenamespace3.com/v123#"
    xmlns="http://www.examplenamespace4.com"
    xmlns:xsi="http://www.examplenamespace4.com/v123">
    <title>
        <version>1.0</version>
        <realMadrid>
            <Ronaldo>Portugal</Ronaldo>
        </realMadrid>
        <barcelona>
            <Messi>Argentina</Messi>
        </barcelona>
        <teamNo>12-13-14</teamNo>
        <gameDate>2017-04-23</gameDate>

        <ns2:abc>
            <ns2:abc1>
                <ns2:abc2 Algorithm="http://www.examplenamespace5.com/">
                </ns2:abc2>
                <ns2:abc3 Algorithm="http://www.examplenamespace5.com/">
                </ns2:abc3>
                <ns2:abc4>
                    <ns2:abc5 Algorithm="http://www.examplenamespace5.com/">
                    </ns2:abc5>
                    <ns2:abc6>ZGVmYXVsdA==</ns2:abc6>
                </ns2:abc4>
            </ns2:abc1>
        </ns2:abc>
    </title>
</myMainRoot>

“test_values.xml”

<myChildRoot>
    <jerseyNo>7</jerseyNo>
    <transferTime>11.09.2009</transferTime>
    <scoreNo>
        <year1>23</year1>
        <year2>22</year2>
        <year3>21.0</year3>
    </scoreNo>
    <scoreNo>
        <year1>43</year1>
        <year2>42</year2>
        <year3>41.0</year3>
    </scoreNo>
    <finalNo>2</finalNo>
</myChildRoot>

“final_values.xml”

<?xml version='1.0' encoding='UTF-8'?>
<ns0:myMainRoot xmlns:ns0="http://www.examplenamespace4.com" xmlns:ns1="http://www.examplenamespace2.com/v123#">
    <ns0:title>
        <ns0:version>1.0</ns0:version>
        <ns0:realMadrid>
            <ns0:Ronaldo>Portugal</ns0:Ronaldo>
        </ns0:realMadrid>
        <ns0:barcelona>
            <ns0:Messi>Argentina</ns0:Messi>
        </ns0:barcelona>
        <ns0:teamNo>12-13-14</ns0:teamNo>
        <ns0:gameDate>2017-04-23</ns0:gameDate>

        <ns1:abc>
            <ns1:abc1>
                <ns1:abc2 Algorithm="http://www.examplenamespace5.com/">
                </ns1:abc2>
                <ns1:abc3 Algorithm="http://www.examplenamespace5.com/">
                </ns1:abc3>
                <ns1:abc4>
                    <ns1:abc5 Algorithm="http://www.examplenamespace5.com/">
                    </ns1:abc5>
                    <ns1:abc6>ZGVmYXVsdA==</ns1:abc6>
                </ns1:abc4>
            </ns1:abc1>
        </ns1:abc>
    </ns0:title>
    <extended>
        <jerseyNo>7</jerseyNo>
        <transferTime>11.09.2009</transferTime>
        <scoreNo>
            <year1>23</year1>
            <year2>22</year2>
            <year3>21.0</year3>
        </scoreNo>
        <scoreNo>
            <year1>43</year1>
            <year2>42</year2>
            <year3>41.0</year3>
        </scoreNo>
        <finalNo>2</finalNo>
    </extended>
</ns0:myMainRoot>

还有我的Python代码:

import xml.etree.ElementTree as ET

tree_of_default_values_xml = ET.parse('1.xml')
root_of_default_values_xml = tree_of_default_values_xml.getroot()

tree_of_data_block_xml = ET.parse("2.xml")
root_of_data_block_xml = tree_of_data_block_xml.getroot()
subelement_to_extend_for_parent_xml_root = ET.SubElement(root_of_default_values_xml, "extended")
subelement_to_extend_for_parent_xml_root.extend(root_of_data_block_xml)
tree_of_default_values_xml.write("3.xml", encoding="UTF-8", xml_declaration=True)

最后,这是我想为“final.xml”做的结果:

<?xml version="1.0" encoding="UTF-8"?>
<myMainRoot xmlns:ns1="http://www.examplenamespace1.com/v123#"
    xmlns:ns2="http://www.examplenamespace2.com/v123#"
    xmlns:ns3="http://www.examplenamespace3.com/v123#"
    xmlns="http://www.examplenamespace4.com"
    xmlns:xsi="http://www.examplenamespace4.com/v123">
    <title>
        <version>1.0</version>
        <realMadrid>
            <Ronaldo>Portugal</Ronaldo>
        </realMadrid>
        <barcelona>
            <Messi>Argentina</Messi>
        </barcelona>
        <teamNo>12-13-14</teamNo>
        <gameDate>2017-04-23</gameDate>
        <ns2:abc>
            <ns2:abc1>
                <ns2:abc2 Algorithm="http://www.examplenamespace5.com/">
                </ns2:abc2>
                <ns2:abc3 Algorithm="http://www.examplenamespace5.com/">
                </ns2:abc3>
                <ns2:abc4>
                    <ns2:abc5 Algorithm="http://www.examplenamespace5.com/">
                    </ns2:abc5>
                    <ns2:abc6>ZGVmYXVsdA==</ns2:abc6>
                </ns2:abc4>
            </ns2:abc1>
        </ns2:abc>
    </title>
    <extended>
        <jerseyNo>7</jerseyNo>
        <transferTime>11.09.2009</transferTime>
        <scoreNo>
            <year1>23</year1>
            <year2>22</year2>
            <year3>21.0</year3>
        </scoreNo>
        <scoreNo>
            <year1>43</year1>
            <year2>42</year2>
            <year3>41.0</year3>
        </scoreNo>
        <finalNo>2</finalNo>
    </extended>
</myMainRoot>

Tags: comhttpversionwwwxmlvaluesxmlnsns1