tinyXML使用

来源:互联网 发布:虎豹骑吕布捏脸数据 编辑:程序博客网 时间:2024/05/29 18:37

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构造方法参数类型是string4 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 // 生成子节点:pNewNode13 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);
复制代码

0 0
原创粉丝点击