首页 > 解决方案 > 如何在python中从一个XML文件创建两个XML文件

问题描述

我有这个 XML 文件

<Source>
    <segment1>
        <userRefNumber>test1</userRefNumber>
        <subscriber>
            <industryCode>ZZZZZ</industryCode>
            <memberCode>12345</memberCode>
            <inquirySubscriberPrefixCode>0622</inquirySubscriberPrefixCode>
        </subscriber>
        <options>
            <country>us</country>
            <language>en</language>
        </options>
        <tracking>
            <transactionTimeStamp>2021-02-25T04:09:30.508-06:00</transactionTimeStamp>
        </tracking>
    </segment1>
    <example2>
        <subscriber>
            <industryCode>ZAAAA</industryCode>
            <memberCode>999999</memberCode>
            <inquirySubscriberPrefixCode>0622</inquirySubscriberPrefixCode>
        </subscriber>
        <options>
            <country>us</country>
            <language>en</language>
        </options>
        <tracking>
            <transactionTimeStamp>2020-02-25T04:09:30.508-06:00</transactionTimeStamp>
        </tracking>
    </example2>
</Source>

我想通过 Python 创建两个 XML 文件,每个孩子一个:

xml1 应如下所示:

<Source>
    <segment1>
        <userRefNumber>test1</userRefNumber>
        <subscriber>
            <industryCode>ZZZZZ</industryCode>
            <memberCode>12345</memberCode>
            <inquirySubscriberPrefixCode>0622</inquirySubscriberPrefixCode>
        </subscriber>
        <options>
            <country>us</country>
            <language>en</language>
        </options>
        <tracking>
            <transactionTimeStamp>2021-02-25T04:09:30.508-06:00</transactionTimeStamp>
        </tracking>
    </segment1>
</Source>

和 xml2 应该是这样的:

<Source>
    <example2>
        <subscriber>
            <industryCode>ZAAAA</industryCode>
            <memberCode>999999</memberCode>
            <inquirySubscriberPrefixCode>0622</inquirySubscriberPrefixCode>
        </subscriber>
        <options>
            <country>us</country>
            <language>en</language>
        </options>
        <tracking>
            <transactionTimeStamp>2020-02-25T04:09:30.508-06:00</transactionTimeStamp>
        </tracking>
    </example2>
</Source>

拆分标准是这样的:为每个元素创建一个单独的 xml 文件。在上面的示例中,有两个元素(segment1 和 example2):因此我想为每个元素创建两个 xml 文件。

我已经检查了这个答案在更多的 .xml 文件(python)中拆分一个大的 .xml 文件,但在那个例子中,孩子们有相同的名字,所以我猜 findall 函数不适用于我的情况,因为孩子们有不同的名字(段 1 和段 2)。是否可以根据根元素的顺序创建单个 xml 文件?

标签: pythonxmlfile

解决方案


下面似乎工作。这里的要点是循环遍历元素并检查其中一个以哪个开头segment

import xml.etree.ElementTree as ET

xml = '''<Source>
    <document>response</document>
    <version>2.0</version>
    <segment1>
        <userRefNumber>test1</userRefNumber>
        <subscriber>
            <industryCode>ZZZZZ</industryCode>
            <memberCode>12345</memberCode>
            <inquirySubscriberPrefixCode>0622</inquirySubscriberPrefixCode>
        </subscriber>
        <options>
            <country>us</country>
            <language>en</language>
        </options>
        <tracking>
            <transactionTimeStamp>2021-02-25T04:09:30.508-06:00</transactionTimeStamp>
        </tracking>
    </segment1>
    <segment2>
        <userRefNumber>test2</userRefNumber>
        <subscriber>
            <industryCode>ZAAAA</industryCode>
            <memberCode>999999</memberCode>
            <inquirySubscriberPrefixCode>0622</inquirySubscriberPrefixCode>
        </subscriber>
        <options>
            <country>us</country>
            <language>en</language>
        </options>
        <tracking>
            <transactionTimeStamp>2020-02-25T04:09:30.508-06:00</transactionTimeStamp>
        </tracking>
    </segment2>
</Source>'''

root = ET.fromstring(xml)
counter = 1
for child in list(root):
    if child.tag.startswith('segment'):
        src = ET.Element('Source')
        src.append(child)
        with open(f'out_{counter}.xml','w') as f:
            tree = ET.ElementTree(src)
            tree.write(f,encoding="unicode")
        counter += 1

推荐阅读