Python解析XML字符串时<ph>标签及后续文本丢失,如何完整重建XML?
问题根源
出现该问题通常由两个原因导致:
- 输入的XML字符串存在语法错误,XML解析器遇到非法格式后直接截断了后续内容的解析
- 提取XML内容的方式有误,仅读取了根节点的
text属性,忽略了子元素和元素尾文本的内容
你提供的XML字符串本身就存在语法错误:string_containing_xml里ph标签内部的转义出现错位,&lt;meta-ref&quot;解码后为<meta-ref",标签名后直接跟双引号,同时name=&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;") ) 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;") ) 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
相关产品推荐
相关产品推荐

