使用etree解析含转义HTML的XML时el.text返回未转义内容的问题
现象原因
XML解析器默认会自动解码节点文本中的5个XML预定义实体:<、>、&、"、',调用.text获取节点内容时,这些实体会被转换为对应的原始字符。
你给出的示例中,XML源里的&lt;是两层转义的结果:XML解析时&会被解码为&,拼接后续的lt;就得到了<,所以你最终拿到的文本里<i>标签还是转义状态,属于XML解析的正常行为。
已转义HTML是否需要二次转义
根据你的存储目的决定:
- 如果你希望存储的是纯文本形态的HTML源码(展示时要显示
<i>这类标记,而非渲染为斜体效果),写入XML前需要对HTML源码做一次实体转义,XML解析后刚好能得到纯文本形态的HTML代码 - 如果你希望存储的是可直接渲染的格式化HTML,不需要二次转义,直接将HTML内容放入XML的
<![CDATA[ ]]>块中存储即可,避免XML解析器把HTML标签识别为XML节点。
同时兼容两种展示需求的配置方案
推荐两种可落地的实现方式:
- 字段拆分方案
为同一内容设置两个独立的存储字段:formatted_content:存放原始未转义的HTML,写入到XML的CDATA块中,需要展示格式化效果时直接读取输出即可plain_content:存放转义后的纯文本HTML源码,需要展示代码形态时直接读取输出即可
- 动态处理方案
所有内容统一存原始未转义的HTML到CDATA块中,渲染时根据需求实时处理:- 纯文本展示场景:调用对应语言的HTML实体转义方法(比如Python的
html.escape()、JS的textContent赋值)对内容做转义后输出 - 格式化展示场景:直接输出原始HTML内容即可
- 纯文本展示场景:调用对应语言的HTML实体转义方法(比如Python的
不建议用多层转义的方式兼容两种场景,会大幅提升逻辑复杂度,还容易出现转义层数混乱的异常。
内容的提问来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

