博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TinyXML 使用说明

Posted on 2011-11-27 18:03  泡泡糖  阅读(14802)  评论(2编辑  收藏  举报

  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);