首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能用io模块序列化minidom树

不能用io模块序列化minidom树
EN

Stack Overflow用户
提问于 2017-05-30 05:23:20
回答 1查看 189关注 0票数 0

我必须使用使用xml.dom.minidom的遗留代码(而且我不能迁移到lxml)。

我想解析这个最小的示例:

代码语言:javascript
复制
<body>
    <p>English</p>
    <p>Français</p>
</body>

以下功能工作得很好:

代码语言:javascript
复制
import codecs
import xml.dom.minidom


def transform1(src_path, dst_path):
    tree = xml.dom.minidom.parse(src_path)
    # ...
    with codecs.open(dst_path, mode="w", encoding="utf-8") as fd:
        tree.writexml(fd, encoding="utf-8")

但是,如果我改为使用io,那么一切都会出错:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/path/to/minidom_demo.py", line 23, in <module>
    transform2("sample.xml", "result.xml")
  File "/path/to/minidom_demo.py", line 18, in transform2
    tree.writexml(fd, encoding="utf-8")
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/dom/minidom.py", line 1747, in writexml
    writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
TypeError: must be unicode, not str

如果以二进制模式(mode="wb")打开文件,则会有另一个异常,即:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/path/to/minidom_demo.py", line 23, in <module>
    transform2("sample.xml", "result.xml")
  File "/path/to/minidom_demo.py", line 18, in transform2
    tree.writexml(fd, encoding="utf-8")
  ...
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/dom/minidom.py", line 298, in _write_data
    writer.write(data)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 4: ordinal not in range(128)

minidom作者似乎不知道Unicode。

为什么它与codecs一起工作?

有办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-30 16:20:02

writexml方法似乎总是转储str。阅读文档告诉我,它的encoding参数只将编码属性添加到XML。

在版本2.3中更改:对于文档节点,可以使用额外的关键字参数编码来指定XML头的编码字段。

你可以试一试:

代码语言:javascript
复制
fd.write(tree.toxml(encoding="utf-8").decode("utf-8"))

上面的内容将将XML保存为UTF-8,并在XML头中指定编码。

如果不指定编码,它仍将保存为UTF-8,但编码属性不会包含在标头中。

代码语言:javascript
复制
fd.write(tree.toxml())

如果指定编码,但不指定decode(),则会在toxml()返回str时引发异常,这是非常奇怪的。

代码语言:javascript
复制
TypeError: write() argument 1 must be unicode, not str
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44254044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档