python - 如何在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 文件,每个孩子一个:
- segment1 的一个 xml 文件
- segment2 的一个 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 文件?
解决方案
下面似乎工作。这里的要点是循环遍历元素并检查其中一个以哪个开头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
推荐阅读
- php - 使用 Laravel 返回一对多 Eloquent Relation 中的最后一条记录
- http - 在真实网络中,服务器是否相互发送请求?
- elasticsearch - 如何根据 Elasticsearch 中的最大单词数对句子进行标记?
- reactjs - 为什么酶测试在 React 中不起作用?
- sql - 如何知道外键是否在删除子句上有级联
- rust - 当变量和函数同名时如何调用函数?
- c# - 单个文件夹应可供组织中的所有用户使用
- c# - 反序列化字符串(AuthenticationHeaderValue.Parameter)
- python - 为什么要在赋值之前先定义一个list类型的python变量?
- database - 使用 mongo 控制台在 Mongo db 中创建索引时出错