【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.hqwc.cn/news/295766.html

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

相关文章

自学华为鸿蒙开发?一般人我还是劝你算了吧!!!

本人纯屌丝一枚&#xff0c;在学编程之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说自学鸿蒙开发&#xff0c;一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单&#xff0c;是个人稍微认点真都能懂&#xff0c;…

RocketMQ事务消息实现分布式事务

文章目录 简介实现原理实现逻辑 简介 RocketMQ事务消息 RocketMQ在4.3.0版中支持分布式事务消息&#xff0c;这里RocketMQ的事务消息是采用2PC(两段式协议) 补偿机制&#xff08;消息回查&#xff09;的分布式事务功能。提供消息发送与业务落库的一致性。 RocketMQ事务消息&am…

windows下使用vccode+cmake编译cuda程序

1、在vscode中安装Nsight Visual Studio Code Edition 在vscode中安装插件能够对cuda的代码进行语法检查 2、编写cuda程序 #include <iostream>__global__ void mykernelfunc(){}; int main() {mykernelfunc<<<1,1>>>();std::cout << "hel…

IDEA常用快捷键一

一、文本编辑 1、Ctrl X &#xff1a;剪切 剪切选中的文本&#xff0c;若是没有选中&#xff0c;则剪切当前行。 2、CtrlC&#xff1a;复制 复制选中文本&#xff0c;若未选中则复制当前行。 3、CtrlV&#xff1a;粘贴 4、Ctrl Shift V: 从历史中选择粘贴 从历史剪…

视频监控管理平台/智能监测/检测系统EasyCVR智能地铁监控方案,助力地铁高效运营

近日&#xff0c;关于全国44座城市开通地铁&#xff0c;却只有5座城市赚钱的新闻冲上热搜。地铁作为城市交通的重要枢纽&#xff0c;是人们出行必不可少的一种方式&#xff0c;但随着此篇新闻的爆出&#xff0c;大家也逐渐了解到城市运营的不易&#xff0c;那么&#xff0c;如何…

PMP项目管理 - 成本管理

系列文章目录 系统架构设计 PMP项目管理 - 整合管理 PMP项目管理 - 范围管理 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 PMP项目管理 - 沟通管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞…

Python开发GUI常用库PyQt6和PySide6介绍之二:设计师(Designer)

Python开发GUI常用库PyQt6和PySide6介绍之二&#xff1a;设计师&#xff08;Designer&#xff09; PySide6和PyQt6都有自己的设计师&#xff08;Designer&#xff09;&#xff0c;用于可视化地设计和布局GUI应用程序的界面。这些设计师提供了丰富的工具和功能&#xff0c;使开…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V1模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V1模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V1模型算法详解前言ShuffleNet_V1讲解group convolution(分组卷积)Channel Shuffle(通道混洗)ShuffleNet Uint(S…

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

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

【Vulnhub 靶场】【Corrosion: 1】【简单】【20210731】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/corrosion-1,730/ 靶场下载&#xff1a;https://download.vulnhub.com/corrosion/Corrosion.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月31日 文件大小&#xff1a;7.8 GB 靶场作者&#xf…

Java--抽象工厂设计模式

抽象工厂设计模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负责…

化繁为简,Python快速入门,从基础到实践的学习。

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并&#xff08;拼接&#xff09;字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …