TinyXml 优秀的开源 xml 解析器
前端之家收集整理的这篇文章主要介绍了
TinyXml 优秀的开源 xml 解析器,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
502_5@
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
如下是一个XML片段:
代码链接:@L_301_1@
@H_
502_5@
<Persons> <Person ID="1"<name>周星星</name<age>20/age/Person"2">白晶晶>18/Persons> |
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0"?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。。。
对应的XML文件:
读写XML文件的程序代码:
#include<iostream> #include"tinyxml.h" #include"tinystr.h" #include<string> #include<windows.h<atlstr> using namespace std; CString GetAppPath() {//获取应用程序根目录 TCHAR modulePath[MAX_PATH]; GetModuleFileName(NULL,modulePath); CString strModulePath(modulePath; strModulePath=strModulePath.Left(strModulePath.ReverseFind(_T('\\'; return strModulePath; } /创建xml文件文件保存的路径否则false bool CreateXmlFile(string&szFileName{ try { /创建一个XML的文档对象。 TiXmlDocument*myDocument=newTiXmlDocument/创建一个根元素并连接。 TiXmlElement*RootElement=newTiXmlElement"Persons"; myDocument->LinkEndChild(RootElement; /创建一个Person元素并连接。 TiXmlElement*PersonElement=new TiXmlElement"Person"; RootElement->LinkEndChild(PersonElement/设置Person元素的属性。 PersonElement->SetAttribute"ID"/创建name元素、age元素并连接。 TiXmlElement*NameElement"name"; TiXmlElement*AgeElement"age"; PersonElement-(NameElement(AgeElement/设置name元素和age元素的内容并连接。 TiXmlText*NameContent=new TiXmlText"周星星"; TiXmlText*AgeContent"22"; NameElement-(NameContent; AgeElement-(AgeContent; CString appPath=GetAppPath; string seperator"\\"; string fullPath=appPath.GetBuffer(0+seperator+szFileName>SaveFile(fullPath.c_str;/保存到文件 } catch&e{ return false} return true/读取Xml文件,并遍历 bool ReadXmlFile{ CString appPath/创建一个XML的文档对象。 TiXmlDocument=new TiXmlDocument>LoadFile/获得根元素,即Persons。 TiXmlElement=myDocument->RootElement/输出根元素名称,即输出Persons。 cout<RootElement->Value<endl/获得第一个Person节点。 TiXmlElement*FirstPerson=RootElement->FirstChildElement/获得第一个Person的name节点和age节点和ID属性。 TiXmlElement=FirstPerson->FirstChildElement;// 结点 TiXmlElement=NameElement->NextSiblingElement;//结点 TiXmlAttribute*IDAttribute>FirstAttribute;// 属性 /输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。 cout<NameElement->FirstChild-; cout<AgeElement-<IDAttribute-} int main{ string fileName"info.xml"; CreateXmlFile(fileName; ReadXmlFile} |
官方下载地址:http://www.oschina.net/p/tinyxml
本地下载地址:http://blogimg.chinaunix.net/blog/upfile2/100811111318.zip
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
例如:
?xmlversion"1.0"standalone=no<!– Our to do list data –<ToDo<Item priority>Go to the<bold>Toy store!/bold>/Item>Do bills/ToDo> |
整个对象树:
TiXmlDocument "demo.xml"
TiXmlDeclaration "version=’1.0′" "standalone=no"
TiXmlComment " Our to do list data"
TiXmlElement "ToDo"
TiXmlElement "Item" Attribtutes: priority = 1
TiXmlText "Go to the "
TiXmlElement "bold"
TiXmlText "Toy store!"
TiXmlElement "Item" Attributes: priority=2
TiXmlText "Do bills"
在tinyXML中,用FirstChild("名字")查找节点时,
调用FirstChild
函数的节点与要查找的节点必须成“父子关系”。
句柄
想要健壮地读取一个XML文档,检查
方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的
代码:
TiXmlElement*root=document.FirstChildElement"Document"if(root{ TiXmlElement*element=root"Element"(element*child=element"Child"(child*child2=child>NextSiblingElement(child2{ // Finally do something useful. |
用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:
TiXmlHandle docHandle&document=docHandle.FirstChild.Child.ToElement// do something useful |
一、读取XML,设置节点文本
如下XML片段:
"1.0"encoding"UTF-8"standalone"yes"?<ZXML<ZAPP<VBS_RUNTIME_PARAMS<BROADCAST_VERSION info"版本">8/BROADCAST_VERSION<Broadcast<FileCount info"资源文件个数">69/FileCount<SOURCE_1<ID info"图片编号">1/ID<Versioninfo"图片版本"/Version<Path info"图片路径"/mnt/share/1.bmp/Path<FileMode info"文件处理模式">0/FileMode/SOURCE_1<SOURCE_2/2>2/SOURCE_2. /Broadcast/VBS_RUNTIME_PARAMS/ZAPP/ZXML> |
要设置BROADCAST_VERSION节点的值 8为其他值,可参考如下代码(将值加1):
用ReplaceChild( TiXmlNode* replaceThis,const TiXmlNode& withThis )方法替换
TiXmlDocument doc"zapp.conf"; doc.LoadFile; TiXmlHandle docHandle&doc*Broadcast_ver"ZXML""ZAPP""VBS_RUNTIME_PARAMS""BROADCAST_VERSION"; TiXmlNode*oldnode=Broadcast_verconstchar*ver>GetTextintoldVeratoi(ver; CString newVer; newVer.Format"%d"+1; TiXmlText newText(newVer; Broadcast_ver>ReplaceChild(oldnode; AfxMessageBox(Broadcast_ver;//输出值 doc.SaveFile; |
二,删除节点,属性值
RemoveChild( TiXmlNode* removeThis )方法删除父节点的子节点,
RemoveAttribute( const char * name )方法删除属性值.
例如删除BROADCAST_VERSION节点
@H_
502_5@
TiXmlHandledocHandle(
&
doc);
TiXmlElement
*
Broadcast_ver
=
docHandle.FirstChild(
"
ZXML
).FirstChild(
ZAPP
VBS_RUNTIME_PARAMS
).ToElement();
TiXmlNode
node
->
FirstChild(
BROADCAST_VERSION
);
Broadcast_ver
RemoveChild(node);