元素树失败,字符串中出现不安全的字符



我正在尝试解析包含正则表达式的xml,如下所示:

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

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

我可以使用&lt;而不是<然后一旦解析就替换所有此类字符,但这会使复杂的正则表达式非常难以阅读,并且需要重写包含此类字符组合的正则表达式,以免产生误报,并加载原始 xml 文件,然后交换字符以获得其安全变体,只是为了立即将它们交换回来似乎不必要地占用 cpu 资源。

我应该如何处理这个问题?这对元素树来说太复杂了还是我做错了什么?

XML规范要求必须将<转义到&lt;。每个健全的 XML 处理器都必须遵循规范。请参阅相关讨论: 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$'

最新更新