You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)

代码逻辑说明

  1. 初始化与遍历:解析原始XML,创建新的<data>元素,然后遍历原<data>下的所有子元素。
  2. 处理<B>标签:每次遇到<B>,先把之前正在构建的<combined>(如果有)添加到新<data>,然后创建一个新的<combined>,用<B>的文本作为初始内容。
  3. 处理<I>标签:将<I>的文本追加到当前的<combined>后面,用空格分隔,确保内容连贯。
  4. 处理<O>标签:先完成当前的<combined>分组,然后将<O>的非空文本(比如逗号)直接作为文本节点添加到新<data>中,跳过空白的<O>标签。
  5. 收尾处理:遍历结束后,检查是否还有未添加的<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:10:01