在Python XML解析中保留转义字符
我正在尝试写一个Python脚本,这个脚本可以接收一个或两个XML文件,然后根据输入文件的内容输出一个或两个新文件。我是想用minidom模块来写这个脚本。不过,输入文件里有很多转义字符的实例。
不幸的是,在输出文件中,这些字符被转换成了其他字符,看起来像是换行符。
比如,输入文件中的一行是:
<Entry text="For English For Hearing Impaired
Press 3 on Keypad"
而输出成了:
<Entry text="For English For Hearing Impaired
Press 3 on Keypad"
我了解到,minidom可能是导致这个问题的,因为它不允许在XML属性中使用转义字符(我觉得是这样)。这是真的吗?如果是的话,最好的工具或方法是什么,用来把XML文件解析成Python文档,处理节点并与其他文档交换,然后再输出成新文件?
如果有帮助的话,我在解析和保存这些文件时使用的是'utf-8'编码。我不知道这是否是问题的一部分。谢谢任何人能提供的帮助。
-亚历克斯·凯泽
3 个回答
0


是表示字符 0x0a 的 XML 实体,也就是换行符。解析器正在正确地解析 XML,并给你显示这些字符。如果你想禁止或者以其他方式处理属性中的换行符,解析器给你这些字符之后,你可以随意处理它们。
3
很遗憾,标准的 xml
模块没有关闭转义的选项。所以对我来说,最好的办法就是用 ElementTree
中的方法把它“解码”回来,这个方法是 xml
自己用来处理这个问题的(sax.utils
中的方法不会转义 \n
):
text = ElementTree._escape_attrib(text, 'utf-8')
源 xml 中的文本:
Here is a test message With newline & ampersand
经过“解码”后的文本:
Here is a test message
With newline & ampersand
经过“重新转义”后的文本:
Here is a test message With newline & ampersand
3
自从我发现了 lxml 之后,我就没再用过Python自带的xml模块。这个lxml库能满足你所有的需求。例如……
输入文件:input.xml:
<?xml version="1.0" encoding='utf-8'?>
<root>
<Button3 yposition="250" fontsize="16" language1="For English For Hearing Impaired
Press 3 on Keypad" />
</root>
还有:
>>> from lxml import etree
>>> with open('input.xml') as f:
... root = etree.parse(f)
...
>>> buttons = root.xpath('//Button3')
>>> buttons
[<Element Button3 at 101071f18>]
>>> buttons[0]
<Element Button3 at 101071f18>
>>> buttons[0].attrib
{'yposition': '250', 'language1': 'For English For Hearing Impaired\nPress 3 on Keypad', 'fontsize': '16'}
>>> buttons[0].attrib['foo'] = 'bar'
>>> s = etree.tostring(root, xml_declaration=True, encoding='utf-8', pretty_print=True)
>>> print(s)
<?xml version='1.0' encoding='utf-8'?>
<root>
<Button3 yposition="250" fontsize="16" language1="For English For Hearing Impaired Press 3 on Keypad" foo="bar"/>
</root>
>>> with open('output.xml','w') as f:
... f.write(s)
>>>