Xerces C++解析XML文档文档格式.docx
- 文档编号:16683397
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:10
- 大小:21.08KB
Xerces C++解析XML文档文档格式.docx
《Xerces C++解析XML文档文档格式.docx》由会员分享,可在线阅读,更多相关《Xerces C++解析XML文档文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
编译器
-x
C++编译器
库的配置路径
编译源码:
make
makeinstall
(编译可能要花费你好一会儿,在我的机器上花费大约7分钟的时间,所以要耐心等候)
3、学习类库
因为类库很大,所以刚开始,我并没有选择去分析与阅读类库,我是先在网上了一个比较完整的例子,然后对其进行编译和调试,然后从例子下手去分析类库所提供的接口。
这里,我把自己的程序简化了一下,希望可以作为大家学习的例子。
首先,我们需要定义一种XML文档的样式。
在这里,我们简单的定义一种样式(含有中文),如下:
//sample.xml
<
?
xmlversion="
1.0"
encoding="
utf-8"
standalone="
no"
>
国家调查>
Node1>
subNode>
subNode1>
subNode11>
china
111->
江苏<
/subNode11>
112->
天津<
113->
北京<
114->
上海<
115->
广州<
/subNode1>
/subNode>
Asia
12->
韩国<
subNode2>
13->
日本<
/subNode2>
subNode3>
14->
越南<
/subNode3>
subNode4>
15->
柬埔寨<
/subNode4>
subNode5>
16->
老挝<
/subNode5>
/Node1>
Node2>
America
21->
巴西<
22->
阿根廷<
23->
智利<
24->
墨西哥<
25->
巴拉圭<
26->
美国<
27->
加拿大<
/Node2>
Node3>
Europe
31->
英国<
32->
意大利<
33->
法国<
34->
德国<
35->
西班牙<
36->
匈牙利<
/Node3>
Node5>
THEEND<
/Node5>
/国家调查>
定义好格式后,我们来看看程序是如何实现对其解析的,程序如下:
CODE:
[Copytoclipboard]
//CXML.h
#ifndefXML_PARSER_HPP
#defineXML_PARSER_HPP
#include<
xercesc/util/TransService.hpp>
xercesc/dom/DOM.hpp>
xercesc/dom/DOMDocument.hpp>
xercesc/dom/DOMDocumentType.hpp>
xercesc/dom/DOMElement.hpp>
xercesc/dom/DOMImplementation.hpp>
xercesc/dom/DOMImplementationLS.hpp>
xercesc/dom/DOMNodeIterator.hpp>
xercesc/dom/DOMNodeList.hpp>
xercesc/dom/DOMText.hpp>
xercesc/dom/DOMAttr.hpp>
xercesc/parsers/XercesDOMParser.hpp>
xercesc/util/XMLUni.hpp>
xercesc/framework/XMLFormatter.hpp>
xercesc/util/XMLString.hpp>
stdlib.h>
string>
vector>
stdexcept>
usingnamespacestd;
usingnamespacexercesc;
classXMLStringTranslate;
classCXML
{
public:
CXML();
~CXML();
XMLTransService:
:
CodestranServiceCode;
voidxmlParser(string&
)throw(std:
runtime_error);
private:
XMLStringTranslate*XMLTan;
xercesc:
XercesDOMParser*m_DOMXmlParser;
//定义解析对象
};
classXMLStringTranslate
:
publicXMLFormatTarget
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;
toFill;
char*
m_value;
enumConstants
{
kTmpBufSize
=16*1024,
kCharBufSize
=16*1024
};
voidclearbuffer();
virtualvoidwriteChars(constXMLByte*consttoWrite
constunsignedint
count
XMLFormatter*const
formatter);
#endif
//CXML.cpp
iostream>
sstream>
list>
sys/types.h>
sys/stat.h>
errno.h>
unistd.h>
iconv.h>
#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"
endl;
returnfalse;
}
char*pin=in,*pout=out;
int
inLen_=inLen+1;
outLen_=outLen;
iconv(cd,&
pin,(size_t*)&
inLen_,&
pout,(size_t*)&
outLen_);
iconv_close(cd);
returntrue;
TranslatorUTF8ToChinese(string&
strTranslatorMsg)
char*
pstrSource=const_cast<
char*>
(strTranslatorMsg.c_str());
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()))
strTranslatorMsg=pstrDestination;
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("
);
//创建XercesDOMParser对象,用于解析文档
m_DOMXmlParser=newXercesDOMParser;
~CXML()
deleteXMLTan;
Terminate();
catch(XMLException&
excp)
XMLtoolkitterminateerror:
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)
Acomponentofthepathisnotadirectory."
));
elseif(iretStat==ELOOP)
Toomanysymboliclinksencounteredwhiletraversingthepath."
elseif(iretStat==EACCES)
ermissiondenied."
elseif(iretStat==ENAMETOOLONG)
Filecannotberead\n"
//配置DOMParser
m_DOMXmlParser->
setValidationScheme(XercesDOMParser:
Val_Auto);
setDoNamespaces(false);
setDoSchema(false);
setLoadExternalDTD(false);
//调用XercesC++类库提供的解析接口
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());
cout<
strValue;
strValue);
endl;
*************************************************/
//createaniteratortovisitalltextnodes.
DOMNodeIterator*iterator=xmlDoc->
createNodeIterator(pRoot,
DOMNodeFilter:
SHOW_TEXT,
NULL,true);
iterator:
for(DOMNode*current=iterator->
current=iterator->
stringstrValue=XMLTan->
translate(current->
XMLTan->
TranslatorUTF8ToChinese(strValue);
strValue<
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 文档