ElementTree失败,字符串中包含不安全的字符

时间:2016-05-30 11:41:15

标签: xml python-3.x elementtree

我正在尝试解析包含正则表达式的xml:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

也就是说,如果使用诸如ElementTree之类的XML处理器创建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$'