代码之家  ›  专栏  ›  技术社区  ›  Mirac7

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

  •  0
  • Mirac7  · 技术社区  · 8 年前

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

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

    但是,当regex包含不安全字符时,例如 (<=a).*b$ ,ElementTree引发ParseError,指出xml在 < 字符,即使该字符在引号内。

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Community CDub    7 年前

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

    也就是说,如果您使用如下XML处理器创建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="(&lt;=a).*b$" /></conditions>'
    

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

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