python - 如何让 Python 的 ElementTree 忽略引号和属性之间缺少空格?
问题描述
当我跑
from xml.etree import ElementTree
tree = ElementTree.fromstring('<foo bar=""baz=""></foo>')
我明白了
xml.etree.ElementTree.ParseError
:格式不正确(无效标记):第 1 行,第 11 列
这是因为 和 之间没有""
空格baz
。
我在第三方提供给我的 XML 文件中遇到了这个问题。
有什么办法可以让ElementTree
间距变得不那么迂腐,并像有空格一样解析它?
解决方案
因为这听起来像一个解决方案可能看不到......
在出现更好的解决方案之前,这里有一个针对下一个可怜的灵魂的 hacky 解决方法......
def xml_fixup(s): # give it the XML as a tring
flags = re.DOTALL
pat_quotes = '\"[^\"]*\"|\'[^\']*\''
re_quotes = re.compile('(%s)([^>\\s])' % pat_quotes, flags) # TODO: cache
re_pieces = re.compile('([^<]+)|(<)((?:[^\"\'>]+|%s)*)(>)' % pat_quotes, flags) # TODO: cache
pieces = re_pieces.findall(s)
return s[:0].join(map(lambda m: m[0] or m[1] + re_quotes.sub('\\1 \\2', m[2]) + m[3], pieces))
print(xml_fixup('<foo bar=""baz=""></foo>')) # <foo bar="" baz=""></foo>
如果您发现其中的错误,则布朗尼积分!
推荐阅读
- powershell - 根据用户输入从 CSV 文件中为 WinSCP .NET 程序集选择 SFTP 连接数据
- node.js - 在 Redis 中处理并发请求
- hyperledger-fabric - 频道创建失败。密钥组频道申请问题
- java - 使用 Do-while 循环创建三角乘法表
- javascript - NodeJS - 在数组中的每个元素之间按顺序循环遍历数组
- javascript - Vue如何将prop数据分配给arraylist
- ocaml - 如果字符列表中存在字符,OCaml 计数:语法错误
- android - 不知道 NullPoniter 的确切问题
- node.js - 为什么我的 socket.io 服务器会为客户端分配新的套接字 ID 或丢失现有套接字 ID?
- api - 如果您想通过 API 管理 LTE 接口,您更喜欢哪个网络供应商。思科瞻博网络??或其他供应商