Posted on 2006-04-02 18:40
小乔的老哥 阅读(5420)
评论(6) 编辑 收藏 引用 所属分类:
XML技术
上周为项目做了一个小工具,需要由一颗内存树生成XML文档。
由于是在WIN平台,C++环境下编程,所以我选择了APACHE项目下
的XERCES-C作为软件平台进行开发。
XERCES-C是一款优秀的XML开发包。对DOM,SAX等技术做了比较完美
的实现。相关的信息请查看
http:\\xml.apache.org\xerces-c
但是在开发中,遇到了一个不大不小的问题,就是将内存中的DOM树导出
到文件的时候,默认生成的XML文档的encoding属性是UTF-16编码的,
但是内容却是UTF-8编码的,这样的XML文档实际上是无法被程序处理的。
更郁闷的是,无论我如何设置DOMDocument ,DOMWriter的Encoding 属性,
输出的东西永远都是这个样子的。输入中文那更是想都别想了。
那么如何把XML文档的编码设置成GB2312呢?
我BAIDU,GOOGLE了半天,发现因为这个问题所困扰的兄弟还真不少,
而且也没有太有效的解决办法,甚至有一个哥们无奈之下,干脆自己写了
一个XML解析器(汗。。。)。
经过这几天的工作,我发现了一些这个问题的解决之道,愿与大家分享。
1。 对于文档对象DOMDocument ,在代码中一般是一个名为doc的指针,
它的方法setEncoding ,setAcutalEncoding 对于最后生成的XML代码的编码
好像是没有影响的,但是保险起见,先把他们都设置为
doc->setEncoding(XMLString::transcode("GB2312"));
doc->setAcutalEncoding(XMLString::transcode("GB2312"));
注意,最好是你在对DOM树操作前进行设置。
2。也是最重要的一点,我在网上看到大家一般是用
DOMWriter 的 writeToString 将内存中的DOM树写入文件的,
但是经过我试验,应该用 writeNode 方法将DOM树写入文件。
具体代码如下:
DOMWriter* writer = impl->createDOMWriter(); //其中的impl是文档对象实例
writer->setEncoding(XMLString::transcode("GB2312")); //注意,这和上面讲的doc不是同一个对象
XMLFormatTarget *mytarget;
mytarget = new LocalFileFormatTarget(".\example.xml"); // 这一行创建一个XMLTarget,指向你要写入的文件路径
writer->writeNode(mytarget,*doc);// doc是你的文档对象
writer->release();
用以上代码的方式生成的XML文档就是GB2312编码的了,
以后在文档中增删改查中文都没有问题了。
后记:
核心的问题实际上是不能用writeToString写入文件,改用
writeNode就可以了。由于writeToString实际上是返回了一个
char* ,然后我们又要用一些其他方式,比如fprintf等等方式,
将这个字符串写入文件,我怀疑是在这一步中,出了问题,
我们调用的写文件函数将其自动转码了。但是我将内存中
的这个char*直接输出到屏幕上的时候,居然也是UTF-16的,
估计真的是 writeToString 这个函数有问题吧。
基于XERCES-C编程的人本来就少,大部分人都是基于XERCES-J
在工作。所以XERCES-C相关的使用经验等东西网上就很少,
希望这篇文章可以帮助有需要的兄弟,同时也希望大家都把自己
的使用经验POST一下,共同进步:)
(PS:四个月更新一次blog,我彻底输给我自己了,T.T,以后再忙也要坚持更新)