c语言tinyxml使用方法,TinyXml使用方法
本文用一个详细的例子说明了TiXml的使用方法。如写、查找、插入、替换、加载、遍历等常见操作。
首先简单介绍一下TinyXml,要看详细的在网上搜搜了^_^:
1、TinyXml源代码只有4个cpp文件和2个头文件。
2、首先要理解TinyXml中的各个基本类型之间的关系,看看这个继承图大家就会很明白了!
可以看到TinyXml中的注释comment
,声明declaration,元素element,文本等都是节点Node的子类,也就是说可以把XMl文件中的各个元素当做节点来处理。Node类型也有到各个子类之间的转换方法,如ToElement()转换成元素,ToDocument转换成文档等。
因此可以吧TiXmlNode作为TinyXml的基本数据类型来操作,这样转化到其他类型也比较方便!
3、Document就是整个Xml文档,Comment就是里面的注释,原始类似于HTML中的tag。
如就是一个空元素。
如 你好,其中attr1 arrt2就是ele元素的属性,"hello"
和"world"分别是相应属性的值,最后字符串“你好”就是此节点的一个文本text。
4、要理解TinyXml中的每个节点都可能是另一个节点的父节点这个很重要,因此遍历TinyXml文档要用递归的方法。每个节点都可能有
属性,文本什么的!
5、每个type of TiXmlNode节点的值'value'对应如下 :
Document: filename of the xml file
Element: name of the element
Comment: the comment text
Unknown: the tag contents
Text: the text string
6、TinyXml中Node的类型types是一个枚举类型,其成员如下:
DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION
7、TinyXml的在线文档和主页:
http://www.grinninglizard.com/tinyxmldocs/index.html
8、常用操作详解:
glibc[~]# cat example.cc
#include "tinyxml.h"
#include
usingnamespacestd;
TiXmlDocument *pDoc =NULL;
voidwrite_xml( )
{
TiXmlDocument doc;
TiXmlDeclaration * decl =newTiXmlDeclaration("1.0","","");
doc.LinkEndChild( decl );
TiXmlElement * element1 =newTiXmlElement("AMULE_ToDL");//创建元素element1
element1->SetAttribute("num",5);
doc.LinkEndChild( element1 );
// TiXmlText * text = new TiXmlText( "World" );//创建一个文本
// element->LinkEndChild( text );//链接
TiXmlElement * element11 =newTiXmlElement("name");
element11->SetAttribute("name","GongFong.rmvb");
element1->LinkEndChild( element11 );//链接element11为element1的子节点(子元素)
TiXmlElement * element2 =newTiXmlElement("BT_ToDL");
element2->SetAttribute("num",10);//创建属性
doc.LinkEndChild(element2);
//dump_to_stdout(&doc);
doc.SaveFile("1.xml");
}
voiddump_to_stdout( TiXmlNode* pParent )//Tixml主页上给的一个遍历方法
{
if( !pParent )return;
TiXmlNode* pChild;
TiXmlText* pText;
intt = pParent->Type();
printf("type %d/n", t);
intnum;
switch( t )
{
caseTiXmlNode::DOCUMENT:
printf("Document");
break;
caseTiXmlNode::ELEMENT:
printf("Element [%s]", pParent->Value() );
num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);
switch(num)
{
case0: printf(" (No attributes)");break;
case1: printf("%s1 attribute", getIndentAlt(indent));break;
default: printf("%s%d attributes", getIndentAlt(indent), num);break;
}
break;
caseTiXmlNode::COMMENT:
printf("Comment: [%s]", pParent->Value());
break;
caseTiXmlNode::UNKNOWN:
printf("Unknown");
break;
caseTiXmlNode::TEXT:
pText = pParent->ToText();
printf("Text: [%s]", pText->Value() );
break;
caseTiXmlNode::DECLARATION:
printf("Declaration");
break;
default:
break;
}
printf("/n");
for( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
{
dump_to_stdout( pChild );
}
}
voidsearch(TiXmlNode* pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode
{
if( !pParent )return;
TiXmlNode* pChild= NULL;
intt = pParent->Type();//获取此节点的类型
if(TiXmlNode::ELEMENT == t && (strcmp("Welcome",pParent->Value()) == 0))//搜索元素值为"Welcome"的
{
printf("value %s/n",pParent->Value());//打印值
pParent->SetValue("re-write");//改变其属性
pParent->ToElement()->SetAttribute("hello",20);
TiXmlElement * element1 =newTiXmlElement("AMULE_ToDL");//添加一个节点
element1->SetAttribute("num",5);
pParent->LinkEndChild(element1);
pDoc->SaveFile();//保存文件
}
printf("/n");
for( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
{
search(pChild);
}
}
voidsearch2(TiXmlNode* pParent)//另一种方法:
{
if( !pParent )return;
TiXmlNode* pChild= NULL;
TiXmlNode*tmp = NULL;
intt = pParent->Type();
tmp = pParent->FirstChild("Window");//搜索元素值为"Window"的节点
if(tmp){
//pParent->RemoveChild(tmp);//找到后删除此节点
TiXmlElement * element1 =newTiXmlElement("AMULE_ToDL");
element1->SetAttribute("num",5);
pParent->ReplaceChild(tmp,*element1);//找到"AMULE_ToDL"节点后替换此节点
}
pDoc->SaveFile();//保存文件
printf("/n");
for( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())//遍历一个节点的所兄弟节点,记着单词sibling是兄弟, 姐妹的意思
//也就是说FirstChild()和NextSibling()不是 父节点和子节点的关系
{
search2(pChild);//遍历一个节点的所有子节点
}
}
intmain(intargc,char* argv[])
{
TiXmlDocument doc(argv[1]);
boolloadOkay = doc.LoadFile();
if(loadOkay)
{
pDoc = &doc;
printf("/n%s:/n", argv[1]);
//dump_to_stdout( &doc ); // defined later in the tutorial
search2(&doc);//把TiXmlDocument类型的值复制给一个TiXmlNode类型
}
else
{
printf("Failed to load file /"%s/"/n", argv[1]);
}
return0;
}
glibc[~]# cat example.cc
#include "tinyxml.h"
#include
using namespace std;
TiXmlDocument *pDoc =NULL;
void write_xml( )
{
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
doc.LinkEndChild( decl );
TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//创建元素element1
element1->SetAttribute("num",5);
doc.LinkEndChild( element1 );
// TiXmlText * text = new TiXmlText( "World" );//创建一个文本
// element->LinkEndChild( text );//链接
TiXmlElement * element11 = new TiXmlElement( "name" );
element11->SetAttribute("name","GongFong.rmvb");
element1->LinkEndChild( element11 );//链接element11为element1的子节点(子元素)
TiXmlElement * element2 = new TiXmlElement( "BT_ToDL" );
element2->SetAttribute("num",10);//创建属性
doc.LinkEndChild(element2);
//dump_to_stdout(&doc);
doc.SaveFile( "1.xml" );
}
void dump_to_stdout( TiXmlNode* pParent )//Tixml主页上给的一个遍历方法
{
if ( !pParent ) return;
TiXmlNode* pChild;
TiXmlText* pText;
int t = pParent->Type();
printf( "type %d/n", t);
int num;
switch ( t )
{
case TiXmlNode::DOCUMENT:
printf( "Document" );
break;
case TiXmlNode::ELEMENT:
printf( "Element [%s]", pParent->Value() );
num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);
switch(num)
{
case 0: printf( " (No attributes)"); break;
case 1: printf( "%s1 attribute", getIndentAlt(indent)); break;
default: printf( "%s%d attributes", getIndentAlt(indent), num); break;
}
break;
case TiXmlNode::COMMENT:
printf( "Comment: [%s]", pParent->Value());
break;
case TiXmlNode::UNKNOWN:
printf( "Unknown" );
break;
case TiXmlNode::TEXT:
pText = pParent->ToText();
printf( "Text: [%s]", pText->Value() );
break;
case TiXmlNode::DECLARATION:
printf( "Declaration" );
break;
default:
break;
}
printf( "/n" );
for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
{
dump_to_stdout( pChild );
}
}
void search(TiXmlNode* pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode
{
if ( !pParent ) return;
TiXmlNode* pChild= NULL;
int t = pParent->Type();//获取此节点的类型
if (TiXmlNode::ELEMENT == t && (strcmp("Welcome",pParent->Value()) == 0))//搜索元素值为"Welcome"的
{
printf("value %s/n",pParent->Value());//打印值
pParent->SetValue("re-write");//改变其属性
pParent->ToElement()->SetAttribute("hello",20);
TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//添加一个节点
element1->SetAttribute("num",5);
pParent->LinkEndChild(element1);
pDoc->SaveFile(); //保存文件
}
printf( "/n" );
for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
{
search(pChild);
}
}
void search2(TiXmlNode* pParent)//另一种方法:
{
if ( !pParent ) return;
TiXmlNode* pChild= NULL;
TiXmlNode*tmp = NULL;
int t = pParent->Type();
tmp = pParent->FirstChild("Window");//搜索元素值为"Window"的节点
if(tmp){
//pParent->RemoveChild(tmp);//找到后删除此节点
TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );
element1->SetAttribute("num",5);
pParent->ReplaceChild(tmp,*element1);//找到"AMULE_ToDL"节点后替换此节点
}
pDoc->SaveFile(); //保存文件
printf( "/n" );
for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) //遍历一个节点的所兄弟节点,记着单词sibling是兄弟, 姐妹的意思
//也就是说FirstChild()和NextSibling()不是 父节点和子节点的关系
{
search2(pChild);//遍历一个节点的所有子节点
}
}
int main(int argc, char* argv[])
{
TiXmlDocument doc(argv[1]);
bool loadOkay = doc.LoadFile();
if (loadOkay)
{
pDoc = &doc;
printf("/n%s:/n", argv[1]);
//dump_to_stdout( &doc ); // defined later in the tutorial
search2(&doc); //把TiXmlDocument类型的值复制给一个TiXmlNode类型
}
else
{
printf("Failed to load file /"%s/"/n", argv[1]);
}
return 0;
}
c语言tinyxml使用方法,TinyXml使用方法相关推荐
- R语言临床诊断试验的ROC分析方法示例
R语言临床诊断试验的ROC分析方法示例 ROC(receiver operating characteristic curve)接收者操作特征曲线,是由二战中的电子工程师和雷达工程师发明用来侦测战场上 ...
- 《C语言程序设计:问题与求解方法》——3.8节不同类型数据之间的类型转换
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.8节不同类型数据之间的类型转换,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号 ...
- 《C语言程序设计:问题与求解方法》——3.9节常见编程错误
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.9节常见编程错误,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 3.9 ...
- 《C语言程序设计:问题与求解方法》——1.4节本章习题
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第1章,第1.4节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 一 ...
- python语言编程环境-python语言开发搭建电脑环境的方法
python语言开发搭建电脑环境的方法 发布时间:2020-08-24 15:57:58 来源:亿速云 阅读:89 作者:小新 这篇文章主要介绍了python语言开发搭建电脑环境的方法,具有一定借鉴价 ...
- 【Go语言】【4】GO语言类型和为类型增加方法
一.GO语言的类型 GO语言中内置了如下基础类型: 整型:byte(int8).int16.int.uint等 浮点型:float32.float64 复数类型:complex64.complex12 ...
- C语言求最大公约数3种方法
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105163610 C ...
- 《C语言程序设计:问题与求解方法》——0.5节本章习题
本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第0章,第0.5节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 1 ...
- C语言执行shellcode的五种方法
//C语言执行shellcode的五种方法 #include <windows.h> #include <stdio.h> //data段可读写 #pragma comment ...
- c语言调用linux脚本,C语言执行shellcode的五种方法
//C语言执行shellcode的五种方法 #include #include //data段可读写 #pragma comment(linker, "/section:.data,RWE& ...
最新文章
- 贝叶斯思想概述:从贝叶斯定理到贝叶斯网络
- java struts2配置_Struts2初始化配置的问题
- Vue单文件组件与vue-loader
- Laravel - Auth验证流程以及guard守卫和自定义驱动driver驱动,使用web-token验证
- 基于nbu oj c语言答案,Just oj 2018 C语言程序设计竞赛(高级组)F:Star(结构体排序+最小生成树)...
- Linux学习:第一章-Linux简介
- 揭密 GaussDB T 主备物理复制搭建过程(全)
- 微信小程序Tab选项卡切换大集合
- 嵌入式软件设计第九次实验报告-140201235-陈宇
- 80行代码使用Python+tkinter实现一个计算器
- LINUX SHELL为awt指定分隔符
- c#加粗代码_C# 8中的可空引用类型
- java出现中文乱码_JAVA中文显示乱码问题
- 每日一练蓝桥杯C语言:2020年真题题集(B组)
- 基于matlab计算机视觉的葡萄检测分级系统
- php 阿里云短信对接,验证码使用
- 论文排版——Latex正文中参考文献标注方式
- 500行代码,教你用python写个微信飞机大战
- JS-part12.3-ES6- 箭头函数 / 函数的参数默认值 / 模板字符串 / 点点点运算符 / 解构赋值 / 对象的简写形式
- VR电竞游戏在英特尔®架构上的用户体验优化