【问题标题】:xmlformatter ignore less than in quotesxmlformatter 忽略引号中的小于
【发布时间】:2019-08-10 22:09:56
【问题描述】:

我正在尝试格式化以下 xml

<block formula="MY_VAR < 3"><set-variable name="OTHER_VAR"></set-variable></block>

进入

<block formula="MY_VAR < 3">
  <set-variable name="OTHER_VAR">
  </set-variable>
</block>

使用xmlformatter 并因为我的公式中的&lt; 而出错。具体错误是

ExpatError: not well-formed (invalid token)

当我尝试代码时

my_xml = '<block formula="MY_VAR < 3"><set-variable name="OTHER_VAR"></set-variable></block>'
formatter = xmlformatter.Formatter(indent="1", indent_char="  ", encoding_output="UTF-8", preserve=["literal"])
pretty_xml = formatter.format_string(my_xml)

如何在我的公式中包含小于并能够格式化我的 XML?

【问题讨论】:

标签: python xml python-2.7 xml-formatting


【解决方案1】:

构造xml字符串时可以使用xml.sax.saxutils.quoteattr转义属性值。

>>> my_xml = '<block formula=%s><set-variable name="OTHER_VAR"></set-variable></block>' % su.quoteattr('MY_VAR < 3')
>>> my_xml
'<block formula="MY_VAR &lt; 3"><set-variable name="OTHER_VAR"></set-variable></block>'

如果您不控制 xml 的构造,此 hack 将修复示例中的 xml:

stack = []

out = []
brackets = '<>'

for c in bad_xml:
    if c in brackets:
        try:
            prev = stack[-1]
        except IndexError:
            stack.append(c)
            out.append(c)
        else:
            if prev == c:
                escaped = '&gt;' if c == '>' else '&lt;'
                out.append(escaped)
            else:
                stack.append(c)
                out.append(c)
    else:
        out.append(c)
my_xml = ''.join(out)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2011-10-15
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多