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

Python ElementTree添加XML节点时>被转义的问题求助

XML属性中保留>符号的解决方法

首先明确:XML规范里,属性值中的>允许不转义,但多数XML处理库(比如Python标准库的ElementTree)会默认转义它为>——这其实是合规的,解析时两者等价。如果必须让>以原始形式显示,可按以下方式处理:

方法1:使用lxml库(推荐)

lxml对XML序列化的控制更灵活,默认不会在属性值中转义>,仅转义XML语法要求的<、&、"。

示例代码:

from lxml import etree

# 创建节点结构
root = etree.Element("Root")
param_node = etree.SubElement(root, "Parameter")
param_node.set("value", "(some data >= some other data)")

# 生成XML字符串
xml_content = etree.tostring(root, encoding='unicode', pretty_print=True)
print(xml_content)

输出的XML中,>会保持原始形式:

<Root>
  <Parameter value="(some data >= some other data)"/>
</Root>

方法2:手动序列化(标准库ElementTree场景)

如果只能用Python标准库的ElementTree,需要手动实现XML序列化逻辑,仅转义必须处理的字符(<、&、"),保留>。

示例序列化函数:

import xml.etree.ElementTree as ET

def serialize_element(el):
    # 处理属性
    attrs = []
    for key, val in el.attrib.items():
        # 仅转义必要字符
        escaped_val = val.replace("&", "&amp;").replace("<", "&lt;").replace('"', "&quot;")
        attrs.append(f'{key}="{escaped_val}"')
    attrs_str = " " + " ".join(attrs) if attrs else ""
    
    # 处理子节点
    children = [serialize_element(child) for child in el]
    if children:
        return f"<{el.tag}{attrs_str}>{''.join(children)}</{el.tag}>"
    else:
        return f"<{el.tag}{attrs_str}/>"

# 测试
root = ET.Element("Root")
param = ET.SubElement(root, "Parameter")
param.set("value", "(some data >= some other data)")

print(serialize_element(root))

输出结果会保留原始的>符号。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:52:22