【XML】TinyXML 详解(二):接口详解

【C++】郭老二博文之:C++目录

1、XML测试文件(laoer.xml)

<?xml version="1.0" standalone="no" ?>
<!-- Hello World !-->
<root><child name="childName" id="1"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child></child><child name="childName" id="2">Text</child><child name="childName" id="3"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child><c_child name="c_child4Name" id="4">Text</c_child><c_child name="c_child5Name" id="5">Text</c_child><c_child name="c_child6Name" id="6">Text</c_child></child><child1 name="child1Name" id="4">Text</child1><child2 name="child1Name" id="5">Text</child1><child3 name="child1Name" id="6">Text</child1>
</root>

2、读取文件并打印

加载xml文件:TiXmlDocument::LoadFile()
获取错误信息:TiXmlDocument::ErrorDesc()
打印XML内容:TiXmlDocument::Print( stdout )

#include <iostream>
#include <sstream>#include "tinyxml.h"using namespace std;int main()
{TiXmlDocument doc( "laoer.xml" );bool loadOkay = doc.LoadFile();if ( !loadOkay ){printf( "Could not load file 'gw.xml'. Error='%s'. Exiting.\n", doc.ErrorDesc() );exit( 1 );}doc.Print( stdout );
}

4、属性相关接口

4.1 获取属性

获取属性有四类接口

  • Attribute :获取属性,如果返回空,则表示不存在
  • QueryStringAttribute:获取属性,返回值“错误检查”值
  • C++ STL(使用std::string)
  • C++模版接口

1)Attribute 原型如:

const char* Attribute( const char* name ) const;
const char* Attribute( const char* name, int* i ) const;
const char* Attribute( const char* name, double* d ) const;
……

2)QueryStringAttribute 原型如:

int QueryIntAttribute( const char* name, int* _value ) const;
int QueryDoubleAttribute( const char* name, double* _value ) const;
……

3)C++ STL(使用std::string) 原型如:

const std::string* Attribute( const std::string& name ) const;
const std::string* Attribute( const std::string& name, int* i ) const;
const std::string* Attribute( const std::string& name, double* d ) const;int QueryIntAttribute( const std::string& name, int* _value ) const;
int QueryDoubleAttribute( const std::string& name, double* _value ) const;
……

4)C++模版接口 原型如:

template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const

4.2 设置属性

1)SetAttribute 原型如:

void SetAttribute( const char* name, const char * _value );
void SetAttribute( const char * name, int value );

2)SetDoubleAttribute 原型如:
void SetDoubleAttribute( const char * name, double value );

3)C++STL(使用std::string) 原型如:

void SetAttribute( const std::string& name, const std::string& _value );
void SetAttribute( const std::string& name, int _value );
void SetDoubleAttribute( const std::string& name, double value );
void printNameID(const TiXmlElement * const element)
{std::string name;if (element->QueryStringAttribute( "name", &name ) != TIXML_SUCCESS){std::cout << "[ERR] QueryStringAttribute " << std::endl;}int id = -1;if (!element->Attribute("id", (int*)&id)){std::cout << "[ERR] Attribute(id " << std::endl;}std::cout << "name = " << name <<"; id = " <<id << std::endl;
}

4.3 删除属性

void RemoveAttribute( const char * name );
void RemoveAttribute( const std::string& name )

5、遍历子元素

1)返回第一个子元素:TiXmlElement* TiXmlNode::FirstChildElement()
2)返回第一个匹配“value”的子元素:TiXmlElement* TiXmlElement* FirstChildElement( const std::string& _value )
3)返回下一个兄弟元素:TiXmlElement* NextSiblingElement()
4)返回下一个匹配“value”的兄弟元素:TiXmlElement* NextSiblingElement( const std::string& _value)

#include <iostream>
#include <sstream>#include "tinyxml.h"using namespace std;int main()
{TiXmlDocument doc( "laoer.xml" );TiXmlNode* rootNode = 0;TiXmlElement* rootElement = 0;rootNode = doc.FirstChild( "root" );rootElement = rootNode->ToElement();for( childElement = rootElement->FirstChildElement("child");childElement;childElement = childElement->NextSiblingElement("child") ){printNameID(childElement);}
}

6、TiXmlHandle 类

6.1 检查空指针

TiXmlHandle主要用来检测空节点指针(null)的类。
注意:TiXmlHandle 不是DOM 元素树的一部分,类关系如下
在这里插入图片描述

例如,遍历如下XML文档:

<Document><Element attributeA = "valueA"><Child attributeB = "value1" /><Child attributeB = "value2" /></Element>
<Document>

TiXmlElement每次获取子元素后,都需要检查是否为NULL,否则操作NULL空指针将会报错

TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{TiXmlElement* element = root->FirstChildElement( "Element" );if ( element ){TiXmlElement* child = element->FirstChildElement( "Child" );if ( child ){TiXmlElement* child2 = child->NextSiblingElement( "Child" );if ( child2 ){// Finally do something useful.

使用 TiXmlHandle 可以简化上面的操作

TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{// do something useful

6.2 遍历元素

下面使用while循环遍历元素,看上去很合理,其实Child方法内部是一个线性遍历来查找元素,即下面的示例是两个嵌入的while循环

int i=0; 
while ( true ){TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement();if ( !child )break;// do something++i;}

代替方法:

TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement();for( child; child; child=child->NextSiblingElement("Child") )
{// do something
}

注意上面 NextSiblingElement(“Child”) 和 NextSiblingElement()的区别

6.3 常用接口

TiXmlHandle FirstChild() const;//返回第一个子节点的句柄:
TiXmlHandle FirstChild( const std::string& _value ) const; //返回给定名称的第一个子节点的句柄。
TiXmlHandle FirstChildElement() const;//返回第一个子元素的句柄。
TiXmlHandle FirstChildElement( const std::string& _value ) const;//返回给定名称的第一个子元素的句柄。
TiXmlHandle Child( int index ) const;//返回指定索引“index”子节点的句柄。
TiXmlHandle Child( const std::string& _value, int index ) const;//返回给定名称指定索引“index”子节点的句柄。
TiXmlHandle ChildElement( int index ) const;//返回指定索引“index”子元素的句柄。
TiXmlHandle ChildElement( const std::string& _value, int index ) const//返回给定名称指定索引“index”子元素的句柄。

获取节点、元素、文本、未知元素的接口
TiXmlNode* ToNode() const
TiXmlElement* ToElement() const
TiXmlText* ToText() const
TiXmlUnknown* ToUnknown() const

7、创建XML

1)TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
在“最后子节点”后添加新节点。如果发生错误则返回NULL。(addThis)是const引用,在内部会被复制addThis.Clone()

2)TiXmlNode* LinkEndChild( TiXmlNode* addThis );
在“最后子节点”后添加新节点,这里addThis 是指针,将被作为链表的一个项,插入到链表中,因此它内存管理将有父节点TiXmlNode接管。

3)TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
在指定子节点之前添加子节点。

4)TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );
在指定的子元素之后添加子元素。

5)TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
替换指定的节点

6)bool RemoveChild( TiXmlNode* removeThis );
删除指定的节点

#include <iostream>
#include <sstream>#include "tinyxml.h"using namespace std;int main()
{TiXmlDocument doc( "laoer.xml" );TiXmlNode* rootNode = 0;TiXmlElement* rootElement = 0;// 创建新节点 "child3"TiXmlElement child( "child3" );child.SetAttribute( "name", "child3" );child.SetAttribute( "id", "8" );// 创建节点文本TiXmlText text( "text" );// 创建孙子节点1TiXmlElement c_child1( "c_child" );c_child1.SetAttribute( "name", "c_child1" );c_child1.SetAttribute( "id", "1" );// 创建孙子节点2TiXmlElement c_child2( "c_child" );c_child2.SetAttribute( "name", "c_child2" );c_child2.SetAttribute( "id", "2" );// 组装子节点child.InsertEndChild( text );child.InsertEndChild( c_child1 );child.InsertEndChild( c_child2 );// 获取插入点位置,将新节点插入到指定位置childElement = rootElement->FirstChildElement("child2");rootElement->InsertAfterChild( childElement, child );doc.Print( stdout );doc.SaveFile();
}

修改后的XML如下,请自行和博文开头的做对比

<?xml version="1.0" standalone="no" ?>
<!-- Hello World !-->
<root><child name="childName" id="1"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child></child><child name="childName" id="2">Text</child><child name="childName" id="3"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child><c_child name="c_child4Name" id="4">Text</c_child><c_child name="c_child5Name" id="5">Text</c_child><c_child name="c_child6Name" id="6">Text</c_child></child><child1 name="child1Name" id="4">Text</child1><child2 name="child1Name" id="5">Text</child2><child3 name="child3" id="8">text<c_child name="c_child1" id="1" /><c_child name="c_child2" id="2" /></child3><child3 name="child1Name" id="6">Text</child3>
</root>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可视化开发

可视化开发 数据可视化 交互式可视化 文章目录 可视化开发前言一、可视化开发二、Python数据可视化大屏GIS图像智能识别处理软件开发三、可视化开发必备总结前言 可视化开发可以帮助开发者通过图形化界面和拖放操作来创建、编辑和测试应用程序。使用这些工具,开发者可以提高开…

解决用Fiddler抓包,网页显示你的连接不是专用/私密连接

关键&#xff1a;重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler&#xff0c;重新打开 3、手机删掉证书&#xff0c;重新下载安装。 &#xff08;如果还不行&#xff0c;重新试一遍&#xff0c;先把浏览器…

1223西站坐标更新

1223 西站坐标更新 1.Update for the station’s location def initial_out_map_indoor_points(self):Load the indoor data and update both the wall_matrix and the ditch_matrix.# Initialize the wall_matrix# List of coordinatescoordinates [(417, 287, 417, 290),(4…

CSS3新增特性

CSS3 CSS3私有前缀 W3C 标准所提出的某个CSS 特性&#xff0c;在被浏览器正式支持之前&#xff0c;浏览器厂商会根据浏览器的内核&#xff0c;使用私有前缀来测试该 CSS 特性&#xff0c;在浏览器正式支持该 CSS 特性后&#xff0c;就不需要私有前缀了。 查询 CSS3 兼容性的网…

非静压模型NHWAVE学习(14)—— 算例制作:开闸式异重流(lock-exchange flow)

NHWAVE学习—— 算例制作&#xff1a;开闸式异重流&#xff08;lock-exchange flow&#xff09; 算例简介模型配置代码修改及输入文件制作代码修改参数文件制作&#xff08;input.txt&#xff09;水深和初始密度场文件制作&#xff08;depth.txt & sali0.txt&#xff09; 模…

springboot实现发送邮件开箱即用

springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件&#xff0c;完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0&#xff08;Application …

简述用C++实现SIP协议栈

SIP&#xff08;Session Initiation Protocol&#xff0c;会话初始协议&#xff09;是一个基于文本的应用层协议&#xff0c;用于创建、修改和终止多媒体会话&#xff08;如语音、视频、聊天、游戏等&#xff09;中的通信。SIP协议栈是实现SIP协议的一组软件模块&#xff0c;它…

C# 使用Socket进行简单的通讯

目录 写在前面 代码实现 服务端部分 客户端部分 运行示例 总结 写在前面 在.Net的 System.Net.Sockets 命名空间中包含托管的跨平台套接字网络实现。 System.Net 命名空间中的所有其他网络访问类均建立在套接字的此实现之上。 其中的Socket 类是基于与 Linux、macOS 或 W…

ospf学习纪要

1、为避免区域&#xff08;area0,area1等&#xff09;间的路由形成环路&#xff0c;非骨干区域之间不允许直接相互发布区域间的路由。因此&#xff0c;所有的ABR&#xff08;Area Border Router,区域边界路由器&#xff09;都至少有一个借口属于Area0,所以Area0始终包含所有的A…

Exynos4412 移植Linux-6.1(九)移植tiny4412_backlight驱动的过程及问题解决

系列文章目录 Exynos4412 移植Linux-6.1&#xff08;一&#xff09;下载、配置、编译Linux-6.1 Exynos4412 移植Linux-6.1&#xff08;二&#xff09;SD卡驱动——解决无法挂载SD卡的根文件系统 Exynos4412 移植Linux-6.1&#xff08;三&#xff09;SD卡驱动——解决mmc0: Ti…

基于STM32单片机模拟智能电梯步进电机控制升降毕业设计3

STM32单片机模拟智能电梯步进电机控制数码管显示3 演示视频&#xff08;复制到浏览器打开&#xff09;&#xff1a; 基于STM32单片机的智能电梯控制系统模拟智能电梯步进电机控制系统设计数码管显示楼层设计/DIY开发板套件3 产品功能描述&#xff1a; 本系统由STM32F103C8T6单…

龙芯loongarch64服务器编译安装tensorflow-io-gcs-filesystem

前言 安装TensorFlow的时候,会出现有些包找不到的情况,直接使用pip命令也无法安装,比如tensorflow-io-gcs-filesystem,安装的时候就会报错: 这个包需要自行编译,官方介绍有限,这里我讲解下 编译 准备 拉取源码:https://github.com/tensorflow/io.git 文章中…

关于pygame无法打开对应文件解决办法 pyame.error unable to open file

问题描述&#xff1a; 问题原因&#xff1a; 由于pygame版本过低导致无法进行声音播放&#xff0c;升级对应版本即可完成&#xff01; 解决办法&#xff1a; 升级pygame包版本到2.1.2&#xff0c;即可解决该问题&#xff01; pip install --upgrade pygame2.1.2

C语言之指针

目录 函数的参数 对象和地址 取地址运算符 注意 指针 注意 指针运算符 注意 在C语言中&#xff0c;指针是一个十分重要的概念&#xff0c;它的作用是“指示对象”。 例如&#xff1a;你要去一座公寓楼找一位朋友&#xff0c;公寓楼由很多楼层组成&#xff0c;每个楼层…

十八、本地配置Hive

1、配置MYSQL mysql> alter user rootlocalhost identified by Yang3135989009; Query OK, 0 rows affected (0.00 sec)mysql> grant all on *.* to root%; Query OK, 0 rows affected (0.00 sec)mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)2、…

使用html+css+js+three.js写圣诞树

实现效果&#xff1a; <head><meta charset"UTF-8"><title>Musical Christmas Lights</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css"><sty…

网络编程:多进程和多线程编程

1. 多进程编程 1.1 fork #include <sys/types.h> #include <unistd.h> // 调用失败返回 -1 设置 errno pid_t fork( void );子进程返回 0&#xff0c;父进程返回子进程 PID&#xff1b; 信号位图被清除&#xff08;父进程的信号处理函数不再对新进程起作用&…

【网络编程】网络通信基础——简述TCP/IP协议

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、ip地…