c语言tinyxml使用方法,TinyXml使用方法[通俗易懂]

c语言tinyxml使用方法,TinyXml使用方法[通俗易懂]本文用一个详细的例子说明了TiXml的使用方法。如写、查找、插入、替换、加载、遍历等常见操作。首先简单介绍一下TinyXml,要看详细的在网上搜搜了^_^:1、TinyXml源代码只有4个cpp文件和2个头文件。2、首先要理解TinyXml中的各个基本类型之间的关系,看看这个继承图大家就会很明白了!可以看到TinyXml中的注释comment,声明declaration,元素element,文本等…

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

本文用一个详细的例子说明了TiXml的使用方法。如写、查找、插入、替换、加载、遍历等常见操作。

首先简单介绍一下TinyXml,要看详细的在网上搜搜了^_^:

1、TinyXml源代码只有4个cpp文件和2个头文件。

2、首先要理解TinyXml中的各个基本类型之间的关系,看看这个继承图大家就会很明白了!

a4c26d1e5885305701be709a3d33442f.png

可以看到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;

}

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137954.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java异常处理之throw, throws,try和catch[通俗易懂]

    java异常处理之throw, throws,try和catch[通俗易懂]   程序运行过程中可能会出现异常情况,比如被0除、对负数计算平方根等,还有可能会出现致命的错误,比如内存不足,磁盘损坏无法读取文件等,对于异常和错误情况的处理,统称为异常处理。   Java异常处理主要通过5个关键字控制:try、catch、throw、throws和finally。try的意思是试试它所包含的代码段中是否会发生异常;而catch当有异常时抓住它,并进行相应的处理,使程序不受

  • Java–链表ListNode

    今天我们来介绍一下Java中的链表,作者依旧尽量用白话解释,希望能帮到大家链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。上面是链表的定义,那么我们用通俗点的语言…

  • 毕设/私活/必备,一个挣钱的标准开源前后端分离【springboot+vue+redis+Spring Security】脚手架–若依框架「建议收藏」

    目录java毕业设计项目《100套》推荐订阅前言:主要特性功能:内置功能模板:本地运行系统:后端运行:前端运行:必要配置:项目运行截图:登录:首页:菜单模块:用户绑定角色、角色控制菜单权限显示部门模块:通知公告:日志管理:项目文件结构:后端结构:前端结构:核心技术后端技术前端技术精彩java毕设实战项目推送java毕业设计项目《100套》推荐订阅前言:今天和大家分享一个是一个开源接私…

  • 超详细VSCode安装教程(Windows)「建议收藏」

    本文基于Windows系统博主的VSCode专栏:分享使用VSCode的基本操作与各种技巧

  • RNAseq-GO、biomaRt转换ID

    RNAseq-GO、biomaRt转换IDO.Sativa选用MSU或者RAPDB这两个数据库的genome和gtf文件,介绍一下MSU的ID,RAPDB的同理。TheRiceAnnotationProject(RAP)(https://rapdb.dna.affrc.go.jp/index.html)和RiceGenomeAnnotationProject(RGAP7,MSU)(http://rice.plantbiology.msu.edu/index.shtml)RAP格式为“Os-Chr-g-number”,MSU格式为“L

    2022年10月30日
  • 区块链:P2P技术是什么

    区块链:P2P技术是什么摘要:包括比特币、以太坊等在内的去中心化的区块链平台,其底层网络都是采用的P2P技术实现,每个节点都是对等的。而本文,则先通过介绍P2P技术的特点和发展历史,让大家对P2P这个技术的来龙去脉有一个初步的认识和了解。然后在下一篇文章中,我会详细介绍第三代P2P技术(DHT)—Kademlia算法的实现原理。1.p2p的定义P2P是peer-to-peer的简称,又称为点对点技…

发表回复

您的电子邮箱地址不会被公开。

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