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

Python解析XML字符串时<ph>标签及后续文本丢失,如何完整重建XML?

问题根源

出现该问题通常由两个原因导致:

  1. 输入的XML字符串存在语法错误,XML解析器遇到非法格式后直接截断了后续内容的解析
  2. 提取XML内容的方式有误,仅读取了根节点的text属性,忽略了子元素和元素尾文本的内容

你提供的XML字符串本身就存在语法错误:string_containing_xml里ph标签内部的转义出现错位,&amp;lt;meta-ref&amp;quot;解码后为<meta-ref",标签名后直接跟双引号,同时name=&amp;quot;Firmenname]存在多余的右方括号、属性值未正确闭合,都属于XML非法格式。

修复方案

第一步:修正XML语法错误

根据你的使用场景选择对应修正方式:

场景1:需要把ph标签内的meta-ref作为XML子元素解析

直接修正标签语法错误即可,构造代码如下:

import xml.etree.ElementTree as ET

# 修正meta-ref的标签语法错误,移除多余的引号、方括号,保证标签闭合
string_containing_xml = 'This string comes ok <ph id="1" ax:element-id="0"><meta-ref type="dynamic" name="Firmenname"></meta-ref></ph> this one is not coming'

xml_object_in_string = '<target xmlns:ax="AcrossXliff">{}</target>'.format(
    string_containing_xml.replace("&nbsp;", "&amp;nbsp;")
)

final_xml = ET.fromstring(xml_object_in_string)

场景2:需要把ph标签内的meta-ref作为普通文本保留

对ph标签内部的文本做XML实体转义即可,构造代码如下:

import html
import xml.etree.ElementTree as ET

part1 = 'This string comes ok <ph id="1" ax:element-id="0">'
inner_plain_text = '<meta-ref type="dynamic" name="Firmenname"></meta-ref>'
part2 = '</ph> this one is not coming'

# 仅对需要作为普通文本的内容做转义
string_containing_xml = part1 + html.escape(inner_plain_text) + part2

xml_object_in_string = '<target xmlns:ax="AcrossXliff">{}</target>'.format(
    string_containing_xml.replace("&nbsp;", "&amp;nbsp;")
)

final_xml = ET.fromstring(xml_object_in_string)

第二步:正确提取XML全部内容

xml.etree.ElementTree中,根节点的text属性仅存储第一个子元素之前的文本,子元素后的文本存储在子元素的tail属性中,你可以用递归函数提取所有内容:

def get_full_xml_text(element):
    text_list = [element.text or '']
    for child in element:
        text_list.append(get_full_xml_text(child))
        text_list.append(child.tail or '')
    return ''.join(text_list)

# 调用即可拿到完整内容
full_content = get_full_xml_text(final_xml)

内容的提问来源于stack exchange,提问作者Amiga500

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:45:05