Python处理中文XML遇到的问题

eddyxu 2004-04-21 11:03:49
在处理含有中文,encoding = "gb2312"的xml的时候,遇到
parser.Parse(buffer, 0)
ExpatError: unknown encoding: line 1, column 31

我的源程序:test.py
from xml.dom import minidom
import sys

import iconv_codec

doc = minidom.parse("my.xml")


my.xml的一部分:
<?xml version="1.0" encoding="gb2312"?>
...全文
951 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
limodou 2004-04-24
  • 打赏
  • 举报
回复
cp936是python 2.3带的呀。我用的是windows下的。

用gb2312存了再处理就不行了。xml可以识别的是utf-8。如果还要用python处理xml的话,就必须还保存为utf-8编码。如果是想看的话可以保存为gb2312编码。

因此在打开文件时,如果原文件(.xml文件)已经是utf-8编码,则不用做任何处理。否则原文件要保存为utf-8编码格式的文件,再进行处理。如:

<?xml version="1.0" encoding="utf-8"?>
...

注意编码声明与内容的编码格式一定要对应。如果encoding是gb2312,但内容是用utf-8编码保存的,仍然是错误的。

保存时,如果还要进行处理,则应该保存为utf-8编码。否则可以转换为别的编码。

为什么要用utf-8呢?我想是因为utf-8是通用的国际标准,python的xml模块只支持几种国际标准,象gb2312之类的就不支持了。这是我的猜测。

让python支持gb2312,可以参见我写的文章:

http://limodou.donews.net/limodou/posts/9429.aspx
eddyxu 2004-04-24
  • 打赏
  • 举报
回复
我用gb2312存了以后,在读的时候就出问题了……

xml.parsers.expat.ExpatError: not well-formed (invalid token): line 3, column 20

就是在出现中文的地方
jp311 2004-04-24
  • 打赏
  • 举报
回复
我的python不支持gb2312,cp936办?
eddyxu 2004-04-24
  • 打赏
  • 举报
回复
呵呵,又遇到一个问题,怎么unicode于string互换
eddyxu 2004-04-24
  • 打赏
  • 举报
回复
谢谢,我尝试都用utf-8成功了
limodou 2004-04-23
  • 打赏
  • 举报
回复
我的程序是这样的,你测试一下:
#coding=cp936

import xml.dom.minidom

t=unicode('测试', 'cp936')

doc = xml.dom.minidom.parse("my.xml")
top_element = doc.getElementsByTagName('Root')[0]

new = doc.createElement("channel")
tNode = doc.createElement("title")
tText = doc.createTextNode(t)
tNode.appendChild(tText)
new.appendChild(tNode)
top_element.appendChild(new)

print doc.toxml()
open("my1.xml","w").write(doc.toxml().encode('cp936'))
eddyxu 2004-04-23
  • 打赏
  • 举报
回复
File "D:\work\Python\RssSashWindow.py", line 273, in AddToTree
open("tree.xml","w").write(doc.toxml().encode('cp936'))
File "C:\Python23\lib\xml\dom\minidom.py", line 49, in toxml
return self.toprettyxml("", "", encoding)
File "C:\Python23\lib\xml\dom\minidom.py", line 64, in toprettyxml
return writer.getvalue()
File "C:\Python23\Lib\StringIO.py", line 203, in getvalue
self.buf += ''.join(self.buflist)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)


还是不行……
limodou 2004-04-23
  • 打赏
  • 举报
回复
我写错了。应该是
open("my.xml","w").write(doc.toxml().encode('cp936'))
目的是将unicode重新变成其它的本地编码。unicode.encode()是用来解码的。原来我写的decode应该是将其它编码变成unicode编码用的,用错了。
eddyxu 2004-04-23
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?>
<Root>
<channel>
<title>ABC News</title>
</channel>
</Root>

limodou 2004-04-23
  • 打赏
  • 举报
回复
把你的xml文件截一段,我试试。
eddyxu 2004-04-23
  • 打赏
  • 举报
回复
试过了,用了cp936,也是过gb2312,还是有:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
limodou 2004-04-23
  • 打赏
  • 举报
回复
最后改为
open("my.xml","w").write(doc.toxml().decode('cp936'))
试试。
eddyxu 2004-04-23
  • 打赏
  • 举报
回复
还是不行,我是从wxTextCtrl得到一个value ,print现实是正确的,可是后来输出就有问题了,不知道为什么,下面是我的代码,您帮我看看吧

title = TextCtrl.getValue()
t = title.encode("utf-8")

doc = minidom.parse("my.xml")
top_element = doc.getElementsByTagName('Root')[0]

new = doc.createElement("channel")
tNode = doc.createElement("title")
tText = doc.createTextNode(t)
tNode.appendChild(tText)
new.appendChild(tNode)
top_element.appendChild(new)

open("my.xml","w").write(doc.toxml())
limodou 2004-04-23
  • 打赏
  • 举报
回复
整个文件都要用utf-8编码保存,再试试。
输出时要转换成本地编码,如gb2312或cp936即可。这是因为xml内容使用unicode编码,因此输出时转换一下即可。
eddyxu 2004-04-23
  • 打赏
  • 举报
回复
还有个问题,我在输出到xml的时候,用utf-8编码,也会产生error

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

请教您如何解决呢
limodou 2004-04-22
  • 打赏
  • 举报
回复
我也遇到过这个问题,我最后是将输入文件改成了utf-8编码。输出时,如果需要则再转换成gb2312编码。

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧