xmlformatter игнорировать меньше, чем в кавычках - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь отформатировать следующий 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 и получая ошибку из-за < в моемформула.В частности, ошибка

ExpatError: неправильно сформирован (недопустимый токен)

при попытке ввода кода

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?

1 Ответ

0 голосов
/ 20 марта 2019

Вы можете использовать xml.sax.saxutils.quoteattr , чтобы экранировать значение атрибута при построении строки xml.

>>> 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, этохак исправит 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)
...