在使用xml.etree.ElementTree(python)解析XML时,如何区分常规空格和转义的空格()

时间:2013-12-19 07:14:27

标签: python xml escaping html-escape-characters xml.etree

我正在使用xml.etree.ElementTree来解析XML文件。 我如何强制它去除空格的文本(只是常规空格,而不是 )或留空格并忽略转义(保持原样)? 这是我的问题:

xml_text = """
<root>
    <mytag>
        data_with_space&#32;
    </mytag>
</root>"""
root = xml.etree.ElementTree.fromstring(xml_text)
mytag = root.find("mytag")
print "original text: ", repr(mytag.text)
print "stripped text: ", repr(mytag.text.strip())

打印:

original text:  '\n        data_with_space \n    '
stripped text:  'data_with_space'

我需要什么:

'data_with_space '

或(我可以通过其他方式逃脱):

'data_with_space&#32;'

使用xml.etree.ElementTree的解决方案更可取,因为我必须重写大量代码

1 个答案:

答案 0 :(得分:1)

标准XML库将&#32;' '视为相等。如果直接应用fromstring(xml_text),则无法避免均衡,因此无法区分它们。阻止转义的唯一方法是在应用fromstring()之前将其转换为其他内容,并在之后将其翻译回来。


import xml.etree.ElementTree

stop_escape   = lambda text: text.replace("&#", "|STOP_ESCAPE|")
resume_escape = lambda text: text.replace("|STOP_ESCAPE|", "&#")

xml_text = """
<root>
    <mytag>
        data_with_space&#32;
    </mytag>
</root>"""
root = xml.etree.ElementTree.fromstring(stop_escape(xml_text))
mytag_txt = resume_escape(root.find("mytag").text)
print "original text: ", repr(mytag_txt)
print "stripped text: ", repr(mytag_txt.strip())

你会得到:

original text:  '\n        data_with_space&#32;\n    '
stripped text:  'data_with_space&#32;'