繁体   English   中英

Python xml.etree转义

[英]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>'

我想在哪里看到以下部分:

<&lt><a>b</a></&lt>

<>在XML中不是有效的字符 ,而应替换为&lt; &gt; 分别。

您可以使用正则表达式替换无效的字符:

import re

regexp = re.compile(r'<|>')  # here we are making a regex to catch either the character '<' or '>'
replacement_map = {'<': '&lt;', '>': '&gt;'}  # 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: '&lt;a&gt;hello&lt;/a&gt;'

尽管代码更受人欢迎,但这是进行替换的非常有效的方法。

我想在哪里看到以下部分:

<&lt><a>b</a></&lt>

这不是格式正确的XML。 我想您忘记了分号,但是添加它们并没有帮助。 以下也是格式错误的:

<&lt;><a>b</a></&lt;>

在代码中,您尝试创建名为<>=元素。 那行不通。 XML元素名称中禁止以下所有内容: <>=&gt; &lt;

不幸的是,ElementTree有点松懈,允许您创建伪XML,例如(从问题中得出):

<filter type="test"><<><a>b</a></<><>><a>b</a></>><=><a>b</a></=></f‌​ilter>

如果您使用的是lxml.etree (请参阅http://lxml.de )而不是xml.etree.ElementTree ,则会收到一条错误消息:“ ValueError:无效的标记名称u'<'”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM