Xerces C++解析XML文档.docx
- 文档编号:3777118
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:10
- 大小:21.08KB
Xerces C++解析XML文档.docx
《Xerces C++解析XML文档.docx》由会员分享,可在线阅读,更多相关《Xerces C++解析XML文档.docx(10页珍藏版)》请在冰豆网上搜索。
XercesC++解析XML文档
XercesC++解析XML文档
Xerces-C++是什么?
Xerces-C++的前身是IBM的XML4C项目。
XML4C和XML4J是两个并列的项目,而XML4J是Xerces-J——Java实现——的前身。
IBM将这两个项目的源代码让与Apache软件基金会(ApacheSoftwareFoundation),他们将其分别改名为Xerces-C++和Xerces-J。
这两个项目是ApacheXML组的核心项目(如果看到的是“Xerces-C”而不是“Xerces-C++”,也是同一个东西,因为这个项目一开始就是用C(译者注:
原文为C++)语言编写的)。
Xerces-C++:
功能介绍
Xerces-C++是一个非常健壮的XML解析器,其提供的两种解析XML文档的方法,DOM和SAX(我是采用DOM方法)。
SAX是一个面向事件的编程API.一个解析引擎消耗XML序列数据,并在发现进来的XML数据的结构时回调应用程序,这些回调称为事件句柄.
与SAX不同,它允许对XML文档进行编辑并保存为一个文件或者流,还允许以编程的方式构建一个XML文档.DOM提供了一个内存中的模型,你可以遍历文档树,删除节点或者嫁接新节点.与解析的SAX事件不同,DOM事件反映出用户与文档的互动以及使用文档的改变.
总的来说,SAX是按行遍历XML文档的,而DOM是先把XML文档生成树,然后遍历DOM树,来解析每个节点.
Xerces-C++:
学习的过程
1、平台选择:
在学习Xerces-C++之前你必须选择一种应用平台,可以是windows、linux、cygwin,以及solaris等系统平台。
在这里,我选用的是RedhatEnterpriseLinuxAS3,选用的Xerces-C++是xerces-c-src_2_7_0.tar.gz,可以从官方网站:
http:
//www.apache.org/直接下载。
2、编译源码
由于我下载下来的是源码,所以需要对其进行编译,否则我们无法加载库文件。
首先进入你的工作目录:
cd /home/olcom/laubo(这是我当前工作目录)
然后解压你的源码包:
tarzxvfxerces-c-src_2_7_0.tar.gz
设置包含源代码的环境变量:
exportXERCESCROOT=/home/olcom/laubo/xerces-c-src_2_7_0
进入目录:
cdxerces-c-src_2_7_0/src/xercesc
运行脚本生成makefile文件:
./runConfigure-plinux-cgcc-xg++-C--prefix=/opt/ApacheXML
选项:
-p 为操作系统平台
-c C 编译器
-x C++编译器
-c 库的配置路径
编译源码:
make
makeinstall
(编译可能要花费你好一会儿,在我的机器上花费大约7分钟的时间,所以要耐心等候)
3、学习类库
因为类库很大,所以刚开始,我并没有选择去分析与阅读类库,我是先在网上了一个比较完整的例子,然后对其进行编译和调试,然后从例子下手去分析类库所提供的接口。
这里,我把自己的程序简化了一下,希望可以作为大家学习的例子。
首先,我们需要定义一种XML文档的样式。
在这里,我们简单的定义一种样式(含有中文),如下:
//sample.xml
xmlversion="1.0"encoding="utf-8"standalone="no"?
>
<国家调查>
国家调查>
定义好格式后,我们来看看程序是如何实现对其解析的,程序如下:
CODE:
[Copytoclipboard]
//CXML.h
#ifndefXML_PARSER_HPP
#defineXML_PARSER_HPP
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
usingnamespacexercesc;
classXMLStringTranslate;
classCXML
{
public:
CXML();
~CXML();
XMLTransService:
:
CodestranServiceCode;
voidxmlParser(string&)throw(std:
:
runtime_error);
private:
XMLStringTranslate*XMLTan;
xercesc:
:
XercesDOMParser*m_DOMXmlParser; //定义解析对象
};
classXMLStringTranslate :
publicXMLFormatTarget
{
public:
XMLStringTranslate(constchar*constencoding);
boolTranslatorUTF8ToChinese(string&strTranslatorMsg);
boolUTF8_2(char*in,intinLen,char*out,intoutLen);
stringtranslate(constXMLCh*constvalue);
constXMLCh*consttranslate(constchar*constvalue);
virtual~XMLStringTranslate();
protected:
XMLFormatter*fFormatter;
XMLCh * fEncodingUsed;
XMLCh * toFill;
char* m_value;
protected:
enumConstants
{
kTmpBufSize =16*1024,
kCharBufSize =16*1024
};
voidclearbuffer();
virtualvoidwriteChars(constXMLByte*consttoWrite
,constunsignedint count
,XMLFormatter*const formatter);
};
#endif
//CXML.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"CXML.h"
boolXMLStringTranslate:
:
UTF8_2(char*in,intinLen,char*out,intoutLen) //码型转换
{
iconv_tcd=iconv_open("gbk","UTF-8");
//checkcd
if((int)cd==-1)
{
cout<<"iconvisERROR"< returnfalse; } char*pin=in,*pout=out; int inLen_=inLen+1; int outLen_=outLen; iconv(cd,&pin,(size_t*)&inLen_,&pout,(size_t*)&outLen_); iconv_close(cd); returntrue; } boolXMLStringTranslate: : TranslatorUTF8ToChinese(string&strTranslatorMsg) { char* pstrSource=const_cast char pstrDestination[strTranslatorMsg.length()*2+1]; //如此处编译出错,可改为char *pstrDestination=newchar[strTranslatorMsg.length()*2+1],但要记住释放 memset(pstrDestination,'\0',strTranslatorMsg.length()*2+1); if(! UTF8_2(pstrSource,strTranslatorMsg.length(),pstrDestination,strTranslatorMsg.length())) returnfalse; strTranslatorMsg=pstrDestination; returntrue; } CXML: : CXML() { try { //InitializeXerces-C++library XMLPlatformUtils: : Initialize(); } catch(xercesc: : XMLException&excp) { char*msg=XMLString: : transcode(excp.getMessage()); printf("XMLtoolkitinitializationerror: %s\n",msg); XMLString: : release(&msg); } XMLTan=newXMLStringTranslate("utf-8"); //创建XercesDOMParser对象,用于解析文档 m_DOMXmlParser=newXercesDOMParser; } CXML: : ~CXML() { try { deleteXMLTan; XMLPlatformUtils: : Terminate(); } catch(XMLException&excp) { char*msg=XMLString: : transcode(excp.getMessage()); printf("XMLtoolkitterminateerror: %s\n",msg); XMLString: : release(&msg); } } voidCXML: : xmlParser(string&xmlFile)throw(std: : runtime_error) { //获取文件信息状态 structstatfileStatus; intiretStat=stat(xmlFile.c_str(),&fileStatus); if(iretStat==ENOENT) throw(std: : runtime_error("file_namedoesnotexist,orpathisanemptystring.")); elseif(iretStat==ENOTDIR) throw(std: : runtime_error("Acomponentofthepathisnotadirectory.")); elseif(iretStat==ELOOP) throw(std: : runtime_error("Toomanysymboliclinksencounteredwhiletraversingthepath.")); elseif(iretStat==EACCES) throw(std: : runtime_error("ermissiondenied.")); elseif(iretStat==ENAMETOOLONG) throw(std: : runtime_error("Filecannotberead\n")); //配置DOMParser m_DOMXmlParser->setValidationScheme(XercesDOMParser: : Val_Auto); m_DOMXmlParser->setDoNamespaces(false); m_DOMXmlParser->setDoSchema(false); m_DOMXmlParser->setLoadExternalDTD(false); try { //调用XercesC++类库提供的解析接口 m_DOMXmlParser->parse(xmlFile.c_str()); //获得DOM树 DOMDocument*xmlDoc=m_DOMXmlParser->getDocument(); DOMElement*pRoot=xmlDoc->getDocumentElement(); if(! pRoot) { throw(std: : runtime_error("emptyXMLdocument")); } //createawalkertovisitalltextnodes. /********************************************** DOMTreeWalker*walker= xmlDoc->createTreeWalker(pRoot,DOMNodeFilter: : SHOW_TEXT,NULL,true); //usethetreewalkertoprintoutthetextnodes. std: : cout<<"TreeWalker: \n"; for(DOMNode*current=walker->nextNode();current! =0;current=walker->nextNode()) { char*strValue=XMLString: : transcode(current->getNodeValue()); std: : cout< XMLString: : release(&strValue); } std: : cout< : endl; *************************************************/ //createaniteratortovisitalltextnodes. DOMNodeIterator*iterator=xmlDoc->createNodeIterator(pRoot, DOMNodeFilter: : SHOW_TEXT, NULL,true); //usethetreewalkertoprintoutthetextnodes. std: : cout<<"iterator: \n"; for(DOMNode*current=iterator->nextNode(); current! =0;current=iterator->nextNode()) { stringstrValue=XMLTan->translate(current->getNodeValue()); XMLTan->TranslatorUTF8ToChinese(strValue); std: : cout< } std: : cout< : endl; } catch(xercesc: : XMLException&excp) { char*msg=xercesc: : XMLString: : transcode(excp.getMessage()); ostringstreamerrBuf; errBuf<<"Errorp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Xerces C+解析XML文档 C+ 解析 XML 文档