[英]Python xml.etree escaping
使用python的xml.etree模块时,如何转义XML特殊字符(如“>”和“ <”)以在标记内使用? 我必须手动这样做吗? etree是否有我所缺少的方法或缺点?
考虑:
In [1]: from xml.etree.ElementTree import Element, SubElement, tostring
In [2]: root = Element('filter')
In [3]: root.set('type', 'test')
In [4]: for op in ['<', '>', '=']:
...: sub_elem = SubElement(root, op)
...: child = Element('a')
...: child.text = 'b'
...: sub_elem.append(child)
...:
In [5]: tostring(root)
Out[5]: '<filter type="test"><<><a>b</a></<><>><a>b</a></>><=><a>b</a></=></filter>'
我想在哪里看到以下部分:
<<><a>b</a></<>
<
和>
在XML中不是有效的字符 ,而应替换为<
和>
分别。
您可以使用正则表达式替换无效的字符:
import re
regexp = re.compile(r'<|>') # here we are making a regex to catch either the character '<' or '>'
replacement_map = {'<': '<', '>': '>'} # a dict to map a character to the replacement value.
regexp.sub(lambda match: replacement_map[match.group(0)], '<a>hello</a>') # do the replacement
# output: '<a>hello</a>'
尽管代码更受人欢迎,但这是进行替换的非常有效的方法。
我想在哪里看到以下部分:
<<><a>b</a></<>
这不是格式正确的XML。 我想您忘记了分号,但是添加它们并没有帮助。 以下也是格式错误的:
<<><a>b</a></<>
在代码中,您尝试创建名为<
, >
和=
元素。 那行不通。 XML元素名称中禁止以下所有内容: <
, >
, =
, >
, <
。
不幸的是,ElementTree有点松懈,允许您创建伪XML,例如(从问题中得出):
<filter type="test"><<><a>b</a></<><>><a>b</a></>><=><a>b</a></=></filter>
如果您使用的是lxml.etree
(请参阅http://lxml.de )而不是xml.etree.ElementTree
,则会收到一条错误消息:“ ValueError:无效的标记名称u'<'”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.