tinyxml安装和使用

时间:2022-10-24 19:56:58

下载:

官方文档:http://www.grinninglizard.com/tinyxmldocs/index.html

中文翻译:http://www.cnblogs.com/kex1n/archive/2010/10/03/1841502.html

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

引用来自tinyXML文档

tinyxml安装和使用

iXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。

Tinyxml使用了两种编译选择:使用标准C的char *类型或者使用STL中的std::string,其中使用预处理器TIXML_USE_STL进行控制,即添加了TIXML_USE_STL为使用std::string的。鉴于STL的广泛使用以及其强大功能,下面我以使用std::string的tinyxml说明。

首先使用VS 2005打开tinyxmlSTL.dsp的工程文件,将其编译成一个静态库,debug版本为:tinyxmld_STL.lib,然后开始测试tinyxml库。我的测试计划是这样的:首先使用tinyxml库创建example4.xml,然后将其读出来,然后查询指定节点的属性或文本,再修改example4.xml(修改其中的一些节点值和删除其中一个节点,增加一个节点),然后再读出来以判断是否修改成功。具体是在VS 2005上新建一个控制台工程:Test,注意使用多字节字符集进行编译,同时添加。首先是创建xml文件的代码:

/*!
* /brief 创建xml文件。
*
* /param XmlFile xml文件全路径。
* /return 是否成功。true为成功,false表示失败。
*/
bool CreateXml(std::string XmlFile)
{
// 定义一个TiXmlDocument类指针
TiXmlDocument *pDoc = new TiXmlDocument;
if (NULL==pDoc)
{
return false;
}
TiXmlDeclaration *pDeclaration = new TiXmlDeclaration(_T("1.0"),_T(""),_T(""));
if (NULL==pDeclaration)
{
return false;
}
pDoc->LinkEndChild(pDeclaration);
// 生成一个根节点:MyApp
TiXmlElement *pRootEle = new TiXmlElement(_T("MyApp"));
if (NULL==pRootEle)
{
return false;
}
pDoc->LinkEndChild(pRootEle);
// 生成子节点:Messages
TiXmlElement *pMsg = new TiXmlElement(_T("Messages"));
if (NULL==pMsg)
{
return false;
}
pRootEle->LinkEndChild(pMsg);
// 生成子节点:Welcome
TiXmlElement *pWelcome = new TiXmlElement(_T("Welcome"));
if (NULL==pWelcome)
{
return false;
}
pMsg->LinkEndChild(pWelcome);
// 设置Welcome节点的值
std::string strValue = _T("Welcome to MyApp");
TiXmlText *pWelcomeValue = new TiXmlText(strValue);
pWelcome->LinkEndChild(pWelcomeValue);
// 生成子节点:Farewell
TiXmlElement *pFarewell = new TiXmlElement(_T("Farewell"));
if (NULL==pFarewell)
{
return false;
}
pMsg->LinkEndChild(pFarewell);
// 设置Farewell节点的值
strValue = _T("Thank you for using MyApp");
TiXmlText *pFarewellValue = new TiXmlText(strValue);
pFarewell->LinkEndChild(pFarewellValue);
// 生成子节点:Windows
TiXmlElement *pWindows = new TiXmlElement(_T("Windows"));
if (NULL==pWindows)
{
return false;
}
pRootEle->LinkEndChild(pWindows);
// 生成子节点:Window
TiXmlElement *pWindow = new TiXmlElement(_T("Window"));
if (NULL==pWindow)
{
return false;
}
pWindows->LinkEndChild(pWindow);
// 设置节点Window的值
pWindow->SetAttribute(_T("name"),_T("MainFrame"));
pWindow->SetAttribute(_T("x"),_T(""));
pWindow->SetAttribute(_T("y"),_T(""));
pWindow->SetAttribute(_T("w"),_T(""));
pWindow->SetAttribute(_T("h"),_T(""));
// 生成子节点:Window
TiXmlElement *pConnection = new TiXmlElement(_T("Connection"));
if (NULL==pConnection)
{
return false;
}
pRootEle->LinkEndChild(pConnection);
// 设置节点Connection的值
pConnection->SetAttribute(_T("ip"),_T("192.168.0.1"));
pConnection->SetAttribute(_T("timeout"),_T("123.456000"));
pDoc->SaveFile(XmlFile);
return true;
}&nbsp;

不知你注意到上面的规律没有?首先父节点连接字节点使用函数LinkEndChild,使用方法是:pParentNode-> LinkEndChild(pChild);其次设置类似这种结构<Window name="MainFrame" x="5" y="15" w="400" h="250" />采用SetAttribute函数,这个函数有两个参数,前一个参数表示键,后一个参数表示键值,设置<Farewell>Thank you for using MyApp</Farewell>这种结构采用TiXmlText类,使用LinkEndChild函数进行连结。

上面是创建xml文件的代码,下面介绍读取xml文件的代码。打印整个xml文件的代码很简单,代码如下:

/*!
* /brief 打印xml文件。
*
* /param XmlFile xml文件全路径。
* /return 是否成功。true为成功,false表示失败。
*/
bool PaintXml(std::string XmlFile)
{
// 定义一个TiXmlDocument类指针
TiXmlDocument *pDoc = new TiXmlDocument();
if (NULL==pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile);
pDoc->Print();
return true;
}

Handles

Where browsing an XML document in a robust way, it is important to check for null returns from method calls. An error safe implementation can generate a lot of code like:

TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
TiXmlElement* element = root->FirstChildElement( "Element" );
if ( element )
{
TiXmlElement* child = element->FirstChildElement( "Child" );
if ( child )
{
TiXmlElement* child2 = child->NextSiblingElement( "Child" );
if ( child2 )
{
// Finally do something useful.

Handles have been introduced to clean this up. Using the TiXmlHandle class, the previous code reduces to:

TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{
// do something useful

Which is much easier to deal with. See TiXmlHandle for more information.

xml文档;

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<SearchMode ModeCount="">
<Mode1 Name="Numbers" RECount="" Space="">
<RE1>[-]{,}</RE1>
<RE2>[-]{,}</RE2>
</Mode1>
<Mode2 Name="Lower_Case" RECount="" Space="">
<RE1>[a-z]{,}</RE1>
<RE2>[a-z]{,}</RE2>
<RE3>[a-z]{,}</RE3>
</Mode2>
<Mode3 Name="Lower_Case_Num" RECount="" Space="">
<RE1>[a-z0-]{,}</RE1>
<RE2>[a-z0-]{,}</RE2>
<RE3>[a-z0-]{,}</RE3>
<RE4>[a-z0-]{,}</RE4>
</Mode3>
</SearchMode>
bool GetNodePointerByName(TiXmlElement* pRootEle, const char* strNodeName, TiXmlElement* &destNode)
{ //根据结点名获取结点指针
// 假如等于根节点名,就退出
if ( == strcmp(strNodeName, pRootEle->Value()))
{
destNode = pRootEle;
return true;
} TiXmlElement* pEle = pRootEle;
for (pEle = pRootEle->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())
{
// 递归处理子节点,获取节点指针
if ( != strcmp(pEle->Value(), strNodeName))
{
GetNodePointerByName(pEle, strNodeName, destNode);
}
else
{
destNode = pEle;
printf("destination node name: %s\n", pEle->Value());
return true;
}
}
return false;
} int readXmlFile()
{
TiXmlDocument *pDoc = new TiXmlDocument();
pDoc->LoadFile("xmlData.xml");
TiXmlElement *RootElem = pDoc->RootElement();//root elem TiXmlElement *pEle = NULL; GetNodePointerByName(RootElem, "SearchMode", pEle);//找到值为searchmodes的节点
if (!pEle)
{
cout << "can't find it" << endl;
return ;
}
else
cout << "find it!" << endl;
//遍历该节点
for (TiXmlElement *curEle = pEle->FirstChildElement(); curEle; curEle = curEle->NextSiblingElement())
{
cout << "node:value:" << curEle->Value() << " "; TiXmlAttribute *pAttr = curEle->FirstAttribute();
while (pAttr) //输出所有属性
{
cout << pAttr->Name() << ":" << pAttr->Value() << " ";
pAttr = pAttr->Next();
} cout << endl; for (TiXmlElement *regExElem = curEle->FirstChildElement(); regExElem; regExElem->NextSiblingElement()) //输出子元素的值
{
cout <<regExElem->FirstChild()->Value() << endl; 这块有问题,死循环
} }
delete pDoc;
return ;
}

attr = elem->Attribute("priority");获取某个属性 参考:http://blog.csdn.net/L_Andy/article/details/40615517
http://blog.csdn.net/mjay1234/article/details/7380536

tinyxml安装和使用的更多相关文章

  1. C&plus;&plus;库&lpar;TinyXML&rpar;

    C++库(TinyXML) 什么是XML? "当 XML(扩展标记语言)于 1998 年 2 月被引入软件工业界时,它给整个行业带来了一场风暴.有史以来第一次,这个世界拥有了一种用来结构化文 ...

  2. &lbrack;安卓&rsqb;windows下如何安装Android源码

    本文改写于:http://www.cnblogs.com/skyme/archive/2011/05/14/2046040.html 1.下载并安装git: 在git-scm.com上下载并安装git ...

  3. centos 安装 mysql 5&period;6和workbench

    windows下安装mysql很简单,去官网找到.msi文件,一键安装就OK了. Centos下面安装Mysql5.6其实也是蛮简单的. 注意:centos6.5默认mysql版本是5.1的 1.添加 ...

  4. iOS平台XML解析类库对比和安装说明

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...

  5. crtmpserver的安装,摄像头视频测试

    下载 svn co --username anonymous --password "" https://svn.rtmpd.com/crtmpserver/branches/1. ...

  6. LINUX配置过程记录(二) 工具安装

    安装谷歌游览 sudo apt-get update sudo apt-get install google-chrome-stable Ubuntu 16.04下源码安装Catkin https:/ ...

  7. 在Linux安装和使用LinuxBrew

    简介 LinuxBrew是流行的Mac OS X的一个Linux叉自制包管理器. LinuxBrew是包管理软件,它能从源(在Debian / Ubuntu的如"易/ DEB",并 ...

  8. 强化学习使用pygame模块的安装

    当你正想运行强化学习的游戏时,突然提示没有安装pygame模块怎么办呢? 其实很简单,通过下面的命令,就可以安装: D:\AI\sample\tensorforce>pip install py ...

  9. 怎么样在python 3&period;6里安装tensorflow&quest;

    首先要下载python3.6: https://www.python.org/downloads/release/python-361/ 接着下载: numpy-1.13.0-cp36-none-wi ...

随机推荐

  1. js按钮浮动随手指方向移动而移动

    window.document.getElementById("moveDIV").addEventListener("touchmove", function ...

  2. js模块化编程总结

    大家都知道,js中的变量(variable)有其作用范围,比如:函数里用var定义的变量在函数外是看不到的,而定义在函数外面的变量(不能有没有var修饰)均是全局变量,在js程序的任何位置都可以访问. ...

  3. android打印调用栈

    在某些机器上,不能下断点,出现了某个诡异的问题,想到唯一的解决方式,就是打印调用栈了,google发现这个,记录下,以后备用 Log.d(",Log.getStackTraceString( ...

  4. iOS 深入Objective-C的动态特性

    深入Objective-C的动态特性 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有动态类型(Dynamic typing),动态绑定(Dynamic binding)和 ...

  5. win8笔记本无法搜索wifi信号找不到WLAN该 wifi共享特别注意的服务

    WlansvcWLAN AutoConfigWLANSVC 服务提供配置.发现.连接.断开与 IEEE 802.11 标准定义的无线局域网(WLAN)的连接所需的逻辑.它还包含将计算机变成软件访问点的 ...

  6. NET Core 数据保护2

    ASP.NET Core 数据保护(Data Protection 集群场景)[下]   前言 接[中篇],在有一些场景下,我们需要对 ASP.NET Core 的加密方法进行扩展,来适应我们的需求, ...

  7. asp&period;net导出Excel类库

    using System; using System.Collections.Generic; using System.Reflection; using System.Web; using Exc ...

  8. &period;net mvc ajax list post

    http://*.com/questions/13242414/passing-a-list-of-objects-into-an-mvc-controller-method- ...

  9. mysql通过字段注释查找字段名称

    原文:mysql通过字段注释查找字段名称 有时候表的字段太多,只是大致记得表的注释,想通过字段注释查找字段名称,可以用如下语句: SELECT COLUMN_NAME,column_comment F ...

  10. sqlserver 2005连接超时采用bat命令解决

    将以下内容保存为 openSql.bat 双击运行即可 @echo ========= SQL Server Ports =================== @echo Enabling SQLS ...