ElementTree 因字符串中的不安全字符而失败

ElementTree fails with unsafe characters in strings

我正在尝试解析一个 xml,其中包含如下正则表达式:

<conditions>
  <condition pattern_matches="regex string"/>
</conditions>

但是,当正则表达式包含不安全字符时,例如 (<=a).*b$,ElementTree 会引发 ParseError 指出 xml 在 < 字符处格式不正确,即使该字符是内引号。

我可以使用 &lt; 而不是 < 然后在解析后替换所有这些字符,但这使得复杂的正则表达式很难阅读并且需要重写包含此类字符组合的正则表达式,以便不要创建误报,加载原始 xml 文件,然后将字符交换为它们的安全变体,只是在之后立即将它们交换回来似乎不必要地 cpu 密集。

我该如何解决这个问题?这对 ElementTree 来说太复杂了还是我做错了什么?

XML 规范要求 < 必须转义为 &lt;。每个理智的 XML 处理器都必须遵循规范。参见相关讨论:Invalid Characters in XML .

就是说,如果您使用 XML 处理器(例如 ElementTree)创建 XML,它会为您处理转义和取消转义过程。例如,给定包含 < 的纯正则表达式字符串,ElementTree 会自动将其替换为 &lt; :

>>> 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="(&lt;=a).*b$" /></conditions>'

... 它会在读取属性值后自动将其替换回 < :

>>> sub.attrib["pattern_matches"]
'(<=a).*b$'