如何使用Python重塑指定结构的XML文件?
解决方案:分组构建
<combined>标签 要实现你需要的XML转换,核心思路是遍历原XML的子元素,以<B>标签为分组起点,收集后续所有<I>标签的内容,遇到<B>或<O>时完成当前分组。下面用Python内置的xml.etree.ElementTree库来实现这个逻辑:
完整代码示例
import xml.etree.ElementTree as ET # 你的原始XML内容(也可以从文件加载) original_xml = '''<data> <B>Head1</B> <I>Inter1</I> <I>Inter2</I> <I>Inter3</I> <I>Inter4</I> <I>Inter5</I> <O>,</O> <B>Head2</B> <I>Inter6</I> <I>Inter7</I> <I>Inter8</I> <I>Inter9</I> <O>,</O> <O> </O> </data>''' # 解析原始XML root = ET.fromstring(original_xml) # 创建新的<data>根元素 new_data = ET.Element("data") # 跟踪当前正在构建的<combined>元素 current_combined = None for elem in root: tag = elem.tag # 处理文本,去除前后空白(避免原标签里的多余空格干扰) elem_text = elem.text.strip() if elem.text else "" if tag == 'B': # 如果已有未完成的<combined>,先添加到新<data>中 if current_combined is not None: new_data.append(current_combined) # 创建新的<combined>元素,用当前<B>的文本初始化 current_combined = ET.Element("combined") current_combined.text = elem_text elif tag == 'I' and current_combined is not None: # 将<I>的文本追加到当前<combined>,用空格分隔 if current_combined.text: current_combined.text += f" {elem_text}" else: current_combined.text = elem_text elif tag == 'O': # 先完成当前的<combined>(如果存在) if current_combined is not None: new_data.append(current_combined) current_combined = None # 只添加非空的<O>内容(跳过最后那个空白的<O>) if elem_text: # 把<O>的文本作为普通文本节点添加到新<data> if new_data.text: new_data.text += elem_text else: new_data.text = elem_text # 处理最后可能遗留的<combined>(比如原XML末尾没有<O>的情况) if current_combined is not None: new_data.append(current_combined) # 生成最终的XML字符串(unicode编码保证字符正常显示) result_xml = ET.tostring(new_data, encoding='unicode') print(result_xml)
代码逻辑说明
- 初始化与遍历:解析原始XML,创建新的
<data>元素,然后遍历原<data>下的所有子元素。 - 处理
<B>标签:每次遇到<B>,先把之前正在构建的<combined>(如果有)添加到新<data>,然后创建一个新的<combined>,用<B>的文本作为初始内容。 - 处理
<I>标签:将<I>的文本追加到当前的<combined>后面,用空格分隔,确保内容连贯。 - 处理
<O>标签:先完成当前的<combined>分组,然后将<O>的非空文本(比如逗号)直接作为文本节点添加到新<data>中,跳过空白的<O>标签。 - 收尾处理:遍历结束后,检查是否还有未添加的
<combined>(比如原XML最后没有<O>的情况),确保所有分组都被处理。
输出结果
运行代码后,你会得到期望的XML结构:
<data><combined>Head1 Inter1 Inter2 Inter3 Inter4 Inter5</combined>,<combined>Head2 Inter6 Inter7 Inter8 Inter9</combined>,</data>
(注:如果需要更美观的格式化输出,可以使用xml.dom.minidom库来美化XML字符串)
内容的提问来源于stack exchange,提问作者Abhay
相关产品推荐
相关产品推荐

