我正在尝试解析包含正则表达式的xml,如下所示:
<conditions>
<condition pattern_matches="regex string"/>
</conditions>
但是,当正则表达式包含不安全的字符(例如(<=a).*b$
)时,ElementTree 会引发一个 ParseError,指出 xml 在<
字符处的格式不正确,即使该字符在引号内也是如此。
我可以使用<
而不是<
然后一旦解析就替换所有此类字符,但这会使复杂的正则表达式非常难以阅读,并且需要重写包含此类字符组合的正则表达式,以免产生误报,并加载原始 xml 文件,然后交换字符以获得其安全变体,只是为了立即将它们交换回来似乎不必要地占用 cpu 资源。
我应该如何处理这个问题?这对元素树来说太复杂了还是我做错了什么?
XML规范要求必须将<
转义到<
。每个健全的 XML 处理器都必须遵循规范。请参阅相关讨论: XML 中的无效字符 。
也就是说,如果您使用 XML 处理器(如 ElementTree
)创建 XML,它将为您处理转义和取消转义过程。例如,给定包含 <
的普通正则表达式字符串,ElementTree
自动将其替换为 <
:
>>> from xml.etree import ElementTree as et
>>> root = et.Element("conditions")
>>> regex_str = "(<=a).*b$"
>>> sub = et.SubElement(root, "condition", attrib = {"pattern_matches": regex_str})
>>> et.tostring(root)
'<conditions><condition pattern_matches="(<=a).*b$" /></conditions>'
。它会在读取属性值时自动将其替换回<
:
>>> sub.attrib["pattern_matches"]
'(<=a).*b$'