我正在尝试编写一个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'编码解析并保存这些文件。我不知道这是否是问题的一部分。感谢任何人的帮助。
-Alex Kaiser
答案 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
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)
>>>
答案 1 :(得分:0)


是字符0x0a或换行符的XML实体。解析器正确解析XML并为您指定字符。如果你想禁止或以其他方式处理属性中的换行符,你可以在解析器提供给你之后随意做任何你喜欢的事情。
答案 2 :(得分:0)
不幸的是,标准xml
模块没有关闭转义的选项。因此,对我来说,最好选择escape it back
使用ElementTree
中xml
本身用于此目的的方法{来自sax.utils
的方法不会逃脱{{} 1}}):
\n
源xml中的文本:
text = ElementTree._escape_attrib(text, 'utf-8')
&#34;解码后的文字&#34;:
Here is a test message With newline & ampersand
&#34>后面的文字&#34;:
Here is a test message
With newline & ampersand