如何利用XercesC解析包含中文字符的XML文_第1页
如何利用XercesC解析包含中文字符的XML文_第2页
如何利用XercesC解析包含中文字符的XML文_第3页
如何利用XercesC解析包含中文字符的XML文_第4页
如何利用XercesC解析包含中文字符的XML文_第5页
免费预览已结束,剩余1页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持如何利用Xerces C 解析包含中文字符的XML文如何利用Xerces C+解析包含中文字符的XML文档 下载本文示例代码Xerces-C+ 是目前广泛使用的 XML解析器,在利用它编写 XML应用以处理包含中文字符的XML文档时会出现字符编码错误,如何正确解决这个问题,对于我们开发XML的应用程序非常有用。本文给出了正确处理的方法和实现类的代码,希望能对 大家有所帮助。1. 背景介绍随着XML技术的普及应用,我 国的各行各业有可能会生成大量的包含中文字 符的XML文档。尽管基于Java技术的XML Parser能较好处理这些XML

2、文档, 但是,它不能解决所有的问题,原因是应用开发的复杂性,尤其在我国更为明 显我们知道,企业的许多应用系统的开发采用了 C、C+ VB Delphi、FoxPro等等语言,这些应用不可能用Java语言重新实现,那么,问题就出现 了,如何让这些应用也能处理 XML文档,甚至是包含中文字符的 XML文档 呢?目前有关XML Parser C + +语言的实现,非常著名的有 Apache组织的Xerces 和 IBM 的 XML4C Aparche 的 Xerces 来源于 IBM 的 XML4C 所以,它 们的编程接口是一致的。二者关键的不同在于字符编码。Apache的Xerces1.6目前只支

3、持少数的字符编码,如 ASCII, UTF-8, UTF-16 , UCS4, EBCDIC IBM037 和 IBM1140, ISO-8859-1 和 Windows-1252。因而,采用 Apache的 Xerces C + +解析器不能处理包含中文字符的 XML文档。IBM的XML4(支持 多达 100 种字符编码,它将 Xerces 和 International Components forUnicode (ICU)结合了起来。因而,我们可以选用 XML4C乍为XML的解析器。 在使用XML4C之前,我们需要首先确认 XML4C勺bin目录是否包含在系统 的 Path 之中,bin

4、 目录必须要有这些 dll : xerces-c_1_6_0D.dll ,icudt20.dll ,icuuc20.dll , icuuc20d.dll 。2. 问题描述在XML4C应用过程中,我 发现调用XML4C提供的一些API并不能很好解决中 文问题。如解析XML时生成DOM_Document并利用DOM?法得到某一 DOM_Noc节点时,为了获得DOM_Nod的名字或值,需要调用 DOM_Nod类的getNodeName()或 getNodeValue()方法,并得到 DOMString对象。根据 API 文 档描述,DOMString类的transcode ()方法,返回字符串 的拷

5、贝,并依照本 地代码页对此字符串进行编码处理。因而,我在解析图1的XML文档并试图获得爱国的人们节点的名字时,transcode方法返回不 完整的节点名爱国 ,而不是完整的爱国的人们,这样,我们就无法利用这些信息来进行字符 串比较等等操作,XML的处理就会出现问题。因 而,DOMString的transcode 方法并不能处理XML勺中文字符。v?xml versio n=1.0 en cod in g=GB2312 ?图13.解决的方法针对这种情况,我仔细分析了 XML4(提供的DOMPrint例子,此例子能顺利解 析含中文字符的XML文档,并能打印出XML解析后生成的DOM_Documen

6、t它 利用了 Xerces 的 XMLFormatter 和 XMLFormatTarget类:? XMLFormatter类,提供基本的格式化字符串功能,将解析器生成的基于Unicode的XML数据转换为非Unicode环境 中使用的数据,如本地字符编码等;? XMLFormatTarget 类,为 XMLFormatter 格式化字符串 提供目的地,它需要派生,并利用它的writeChars() 方法得到格式化后的字符串。基于以上分析,我改进了 DOMPri nt的例子程序,实现了一个XMLFormatTarget类的子类,代码如下:/类定义#in clude vframework/XML

7、Formatter.hppclass StrFormatTarget : public XMLFormatTargetpublic:char * GetResult();StrFormatTarget() ;StrFormatTarget () ;void writeChars(co nst XMLByte* const toWrite,const un sig ned intcount,XMLFormatter * constformatter);private:char * buffer;StrFormatTarget (const StrFormatTarget & other);voi

8、d operator=(c onst StrFormatTarget & rhs);/类的实现void StrFormatTarget:writeChars(c onst XMLByte* con st toWrite,const un sig ned intcount,XMLFormatter * constformatter)buffer = (char *)malloc(co unt + 1); memset(buffer,O,co un t+1);memcpy(buffer, (char *) toWrite, count); ;char * StrFormatTarget:GetRe

9、sult()char * ret = (char *)malloc(strle n(buffer)+1);strcpy(ret, buffer); retstrle n( buffer) = 0;free(buffer);return ret;XML文档的编码定义由文档头 给出,支持中文字符编码,我们选用GB2312。 Encoding信息的获取可以有两 种方式,第一,可以直接分析 xml字符串,得到encoding的值;第二,利用 DOMParse解析XML文档时,设定parser能创建XMLDecIType节点,即:DOMParser parser;parser.setToCreateXM

10、LDeclTypeNode(true).在利用XML4(编程时,我们常遇见的类型是 DOMString, XMLCh *,我们 需要将这些类型的数据都转换为char *,然后,进行字符串的各种处理。我这里给出了一个类StrTransformer,专门解决有关字符编码的问题,它不仅 仅支持中文字符编码,而且,可支持XML4C勺其它字符编码。核心代码如下:/ header fileclass StrTra nsformerpublic:char * Cha ngeStr(co nst DOMStri ng& s); char * Cha ngeStr(co nst XMLCh * str);Str

11、Tra nsformer (char * en codi ng);XMLFormatter * format;StrFormatTarget * target;StrTra nsformer();DOMStri ng * m_dom;;/ impleme nt file#in clude StrTra nsformer.h#include #include / Con structio n/Destructio nStrTra nsformer:StrTra nsformer(char * en cod ing) target = new StrFormatTarget();m_dom = n

12、ew DOMStri ng(e ncodi ng);format = new XMLFormatter(m_dom-rawBuffer(), target,XMLFormatter:NoEscapes, XMLFormatter:U nRep_CharRef);StrTra nsformer:StrTra nsformer()delete target;delete m_dom;delete format;char * StrTra nsformer:Cha ngeStr(co nstDOMStri ng &s)un sig ned int lent = s.len gth();if (lent = 0)return NULL;XMLCh* buf = new XMLChlent + 1;XMLStri ng:copyNStri ng(buf, s.rawBuffer(),len t);bufle nt = 0;*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论