TinyXML使用方法[通俗易懂]

TinyXML使用方法[通俗易懂]TinyXML使用说明  TinyXML是一个C++的XML解析库,网上的评价都不错,是一个轻量级的XML解析库。关于TinyXML使用的文章有很多,而且官方也有完整的文档,这里只是简单把自己使用记录写下来,方便以后查阅。     一个XML文档例子:(文章后面会把这个XML当作例子使用)  <!–test.xml–><Persons><P…

大家好,又见面了,我是你们的朋友全栈君。

TinyXML 使用说明

  TinyXML是一个C++的XML解析库,网上的评价都不错,是一个轻量级的XML解析库。关于TinyXML使用的文章有很多,而且官方也有完整的文档,这里只是简单把自己使用记录写下来,方便以后查阅。

  

    一个XML文档例子:(文章后面会把这个XML当作例子使用)

 

复制代码
 <!-- test.xml -->

<Persons>
<Person ID="1">
周星星
</Person>
<Person ID="2">
白晶晶
</Person>
</Persons>
复制代码

 

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来调用。

 

    使用的时候,只要把tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp 这六个文件导入工程,然后#include ” tinyxml.h”就可以使用。

 

在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的一些操作。

 

这些类都是对应XML文件的一些元素,所以最好对XML文件有一些必要的了解。

 

TinyXML库对字符串可以使用两种编译方式:char * 以及 string 。所以我们在Wince使用的时候需要注意宽字符的转换。

 

1、将一个文件加载到 TinyXML DOM 中的最简单方法:

 

1 TiXmlDocument doc( "demo.xml" );
2
3 //注意TiXmlDocument构造方法参数类型是string
4 doc.LoadFile();

2、创建XML文件

 

复制代码
 1 TiXmlDocument doc;
2
3 //xml文件声明部分
4 TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
5
6 //添加新的节点元素
7 TiXmlElement * element = new TiXmlElement( "Hello" );
8
9 //对应Hello节点的值
10 TiXmlText * text = new TiXmlText( "World" );
11
12 //Hello 节点是文本节点,没有子节点
13 element->LinkEndChild( text );
14
15 //把声明和元素添加到文档
16 doc.LinkEndChild( decl );
17 doc.LinkEndChild( element );
18
19 //保存文档,修改过的xml文件一定要调用SaveFile方法保存数据
20 doc.SaveFile( "madeByHand.xml" );
复制代码

3、遍历整个XML文档

XML文档遍历,主要就是把DOM里面的元素、节点、节点属性全部遍历一次。

 

复制代码
//首先需要找到根节点,

TiXmlElement * rootElement = doc.RootElement();

//根节点的第一个子节点(根节点、子节点的概念,请看参考资料)

TiXmlElement * firstElement = rootElement->FirstChildElement();
复制代码

 

 

然后可以用上面的方法循环查询同一个节点下的子节点,再加上一个递归循环就可以查询所有的节点。具体代码看参考工程里面的例子。具体代码已经封装成函数。TinyXMLCtl.h头文件

 

 

我们在Wince里面大部分时候可能都是使用查询XML里面的数据,下面针对给出一个简单的查询功能,然后界面一些TinyXML里面的常用方法。

 

这是一个简单的遍历查询XML文档的代码,功能是遍历XML文档下根节点下的所有兄弟节点。(如果需要遍历兄弟节点下的子节点,需要加个递归调用就好)

 

 

复制代码
//查找根节点,rootElement就是指向<Persons>元素(看文档刚开始时给出的XML文件)

TiXmlElement * rootElement = doc.RootElement();

//查找根节点下第一个子节点,firstElement 指向第一个<Person>节点

TiXmlElement * firstElement = rootElement->FirstChildElement();



TiXmlElement *nextElement = firstElement;

//我在使用的时候使用了TinyXML的char * 字符编译,所以使用的方法返回的字//符串都是 char * 类型的。

const char *value;

const char *name;



//保存遍历得到的数据

CString temp;



//循环遍历根节点下的兄弟节点

while(nextElement)

{

//取出节点的文本节点内容,第一个Person节点的值是周星星

value = nextElement->GetText();

//取出节点的节点名字,第一个节点是Person

name = nextElement->Value();

//TinyXML里面返回的是char *类型的数据,这里要把它转为宽字符,最简单的方法是//直接转为CString,当然也可以用//MultiByteToWideChar,WideCharToMultiByte这两个微软提供的宽字符转换的//函数进行转换,在TinyXMLCtl.h里面,给出了两个封装的函数,具体请自行查看。

CString mmValue(value);

CString mmName(name);

temp = temp + mmValue + L""+ mmName+L"";

//查找下一个兄弟节点的指针

nextElement = nextElement->NextSiblingElement();

}
复制代码

上面最后temp字符串里面应该存放的是:Person 周星星 Person 白晶晶 。

 

上面只是一个简单遍历同级兄弟节点的方法,只要掌握这几个常用方法就可以自己拓展出复杂的查询方法。

 

下面再给出对数据常用的操作方法:增删改查 的简单例子和解析

 

4、修改XML节点

 

复制代码
//下面例子是修改test.xml第一个person节点的值“周星星”改为“星星”

//加载文档到DOM,跟上面一样

TiXmlDocument doc("test.xml");

doc.LoadFile();

//获取一个DOM的句柄,操作XML可以用节点Node、元素Element、或者句柄Handle都可//以。三种操作可以根据实际进行转换,转换方法可以参考官方文档。

TiXmlHandle docHandle( &doc );

//找到要修改的那个节点指针,这里是具体知道节点结构才这么做。实际使用的时候,我们需//要遍历查找一个节点名。在TinyXMLCtl.h头文件给出了实现的方法。下面这句话功能跟//doc.RootElement()效果一样,都是为了找到根节点。

TiXmlElement* DesElement = docHandle.FirstChild("Persons "). ToElement();

//找到该节点的第一个子节点(我们要修改的节点)

TiXmlNode * oldnode = DesElement->FirstChild();

//这里先获取该节点的

const char *ver = DesElement ->GetText();

//新的值,注意字符编码转换问题

string strText=”星星”;

TiXmlText *pValue = new TiXmlText(strText.c_str());

// 首先清除所有文本

pNode->Clear();

//把新文本添加进去,这里只是其中一种修改方法,还可以调用ReplaceChild()方法修改。

pNode->LinkEndChild(pValue);

//一定要保存文件,否则修改无效

doc.SaveFile();
复制代码

 


 

 

5、删除XML节点

节点删除,注意使用两个方法:

RemoveChild( TiXmlNode* removeThis )//方法删除父节点的子节点
RemoveAttribute( const char * name )//方法删除属性值.

 

复制代码
 1 //删除第一个节点Person
2
3 TiXmlDocument doc( "\\Storage Card\\test.xml" );
4
5 doc.LoadFile();
6
7 TiXmlElement * rootElement = doc.RootElement();
8
9 TiXmlElement * firstElement = rootElement->FirstChildElement();
10
11 //删除根节点下的第一个节点
12
13 RemoveChild(firstElement);
14
15 doc.SaveFile();
复制代码

 


 

5、新增XML节点

//加载文档

 

复制代码
 1 TiXmlDocument *pDoc = new TiXmlDocument();
2
3 pDoc->LoadFile(pXMLFile);
4
5 TiXmlElement * rootElement = doc.RootElement();
6
7 TiXmlElement * firstElement = rootElement->FirstChildElement();
8
9
10 string strText=“hello”;
11
12 // 生成子节点:pNewNode
13
14 TiXmlElement *pNewNode = new TiXmlElement(strNodeName.c_str());
15
16 // 设置节点文本,然后插入节点
17
18 TiXmlText *pNewValue = new TiXmlText(strText.c_str());
19
20 pNewNode->LinkEndChild(pNewValue);
21
22 //插入节点
23
24 pNode->InsertEndChild(*pNewNode);
25
26 pDoc->SaveFile(pXMLFile);
复制代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131014.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • arcgis二次开发python-ArcGIS 二次开发专题 序「建议收藏」

    arcgis二次开发python-ArcGIS 二次开发专题 序「建议收藏」依据ArcGIS组件式开发及应用的目录结构,将系统性的学习ArcGIS二次开发的道路分为三个部分。这个系列包含以下三个部分:Part1基础1.前言1.1组件式GIS1.2ArcObject开发的特点与历史2.使用ArcGISEngine控件编程3.几何形体对象Geometry4.地图组成5.空间数据符号化6.空间数据管理7.空间分析8.空间数据编辑9.地图输出10…

    2022年7月23日
    7
  • ubuntu安装python3_在Ubuntu中安装Python3

    ubuntu安装python3_在Ubuntu中安装Python3原博文2012-09-2517:15−首先,通过命令行安装Python3.2,只需要在终端中通过命令行安装即可:sudoapt-getinstallpython3一路yes。因为Ubuntu很多底层采用的是Python2.*,Python3和Python2是互相不兼容的,所以此时不能卸载Python2,需要将默认Pyth…154567相关推荐2017-12-2722:00…

    2022年6月23日
    39
  • 智能小车设计思路简述

    智能小车设计思路简述简单的说就是把微控制器(单片机)的管脚和外设的引脚用杜邦线相连,就可以使用微控制器通过自身管脚给外设发送信号,以实现外设的运行。能力较强的可以自己设计一块电路板,把微控制器和一部分外设直接插在板子上面的排座上,减少杜邦线的使用(使用杜邦线太多会比较乱),还可以在板子上设计一些必要的电路如稳压电路、按键电路、电机驱动电路,这些电路网上也能买到。其实小车后期前进后退、循迹、避障的功能是否顺滑,大部分取决于代码的编写,有的时候还需要在代码中加入算法。智能小车的设计主要包含两部分,硬件部分和软件部分。……

    2022年10月9日
    0
  • pytest skipif_pytest断言方法

    pytest skipif_pytest断言方法前言pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能Skip和xfail:处理那些不会成功的测试用例你可以对那些在某些特定平台上不能运行的测试用

    2022年7月29日
    3
  • int(11,2)_算法笔记视频

    int(11,2)_算法笔记视频week1伪代码与时间复杂度伪代码(PseudoCode)这部分略过,基本上表达出自己意思别人也能看懂就行时间复杂度(Timecomplexity)要注意的是f(n)和大O(g(n)),f(n)=O(g(n))算法频度f(n):该算法基本操作需要执行的次数辅助函数g(n):n取无穷时可近似f(n)—》limf(n)/g(n)等于常数时间渐进复杂度O(g(n)):时间复杂度,通常用O(n)表示运行算法的规模下图为展示了时间复杂度之间比较关系部分题型:给定一式子,要求

    2022年8月11日
    1
  • yuv420p 详解_图文详解YUV420数据格式

    一.YUV格式与RGB格式的换算RGB转换成YUVY=(0.257*R)+(0.504*G)+(0.098*B)+16Cr=V=(0.439*R)-(0.368*G)-(0.071*B)+128Cb=U=-(0.148*R)-(0.291*G)+(0.439*B)+128YUV转换成RGBB=…

    2022年4月9日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号