python - xmlformatter 忽略引号中的小于
问题描述
我正在尝试格式化以下 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?
解决方案
您可以在构造 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 < 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 = '>' if c == '>' else '<'
out.append(escaped)
else:
stack.append(c)
out.append(c)
else:
out.append(c)
my_xml = ''.join(out)
推荐阅读
- mysql - Laravel获取A列每个月的最后一条记录,并在MySQL中使用SUM B列值
- java - 在使用 simpledateformat 解析日期时,您如何考虑两种可能的日期格式,一种是毫秒,另一种是没有?
- r - 使用 ifelse 将值分配给 R 中的新数据框列
- html - 如何在 CSS 中将文本环绕在 img 周围?
- kotlin - Kotlin:“类型推断失败”
- php - PHP 错误:类 'Illuminate/Foundation/Auth/Admin' [Laravel 8]
- node.js - 在 Vultr VPS Ubuntu 64 上设置的 Discord Bot 使用 nohup 命令启动每隔几个小时就会脱机
- apache-spark - Spark Structured Streaming 读取嵌套的 Kafka Connect jsonConverter 消息
- python - Google Compute Engine,对来自 Cloud Functions 的传入数据进行排队
- python - 使用 urllib 和 bs4 "http.client.BadStatusLine:" 时出现错误