在Python XML解析中保留转义字符

时间:2010-10-28 01:02:22

标签: python xml parsing escaping

我正在尝试编写一个python脚本,它接收一个或两个xml文件,并根据输入文件的内容输出一个或两个新文件。我试图使用minidom模块编写此脚本。但是,输入文件包含许多转义字符实例

内部节点属性。不幸的是,在输出文件中,这些字符已被转换为不同的字符,这些字符似乎是换行符。

例如,输入文件中的一行,例如:

<Entry text="For English For Hearing Impaired&#xa;Press 3 on Keypad"

将输出为

<Entry text="For English For Hearing Impaired
Press 3 on Keypad"

我读到minidom导致这种情况,因为它不允许xml属性中的转义字符(我认为)。这是真的?并且,如果是这样,用于将xml文件解析为python文档,操作节点并与其他文档交换它们并将文档输出回新文件的最佳工具/方法是什么?

如果有帮助,我还使用'utf-8'编码解析并保存这些文件。我不知道这是否是问题的一部分。感谢任何人的帮助。

-Alex Kaiser

3 个答案:

答案 0 :(得分:4)

自发现lxml以来,我没有使用过Python的标准xml模块。它可以做你想要的一切。例如......

input.xml中:

<?xml version="1.0" encoding='utf-8'?>
<root>
  <Button3 yposition="250" fontsize="16" language1="For English For Hearing Impaired&#xa;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&#10;Press 3 on Keypad" foo="bar"/>
</root>
>>> with open('output.xml','w') as f:
...     f.write(s)
>>>

答案 1 :(得分:0)

&#xa;是字符0x0a或换行符的XML实体。解析器正确解析XML并为您指定字符。如果你想禁止或以其他方式处理属性中的换行符,你可以在解析器提供给你之后随意做任何你喜欢的事情。

答案 2 :(得分:0)

不幸的是,标准xml模块没有关闭转义的选项。因此,对我来说,最好选择escape it back使用ElementTreexml本身用于此目的的方法{来自sax.utils的方法不会逃脱{{} 1}}):

\n

源xml中的文本:

text = ElementTree._escape_attrib(text, 'utf-8')

&#34;解码后的文字&#34;:

Here is a test message&#10;With newline &amp; ampersand

&#34>后面的文字&#34;:

Here is a test message
With newline & ampersand