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("&", "&").replace("<", "<").replace('"', """) 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
相关产品推荐
相关产品推荐

