大家好,又见面了,我是你们的朋友全栈君。
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);
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/131014.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...