菜鸟笔记
提升您的技术认知

c 解析xml文件-ag真人游戏

新的一周又来啦,这周我要分享的是使用c 库解析xml文件和json文件,在本篇博客中我主要讲解析xml文件的相关知识,在下篇博客讲述有关解析json文件的相关。在解析xml文件时我使用的解析库是tinyxml2,编译平台是vs2019。希望看完本篇博客能对你有所帮助。

在学习解析xml文件之前我们应该先了解什么是xml文件。

xml文件是什么?

xml 指可扩展标记语言(extensible markup language),设计用来传输和存储数据。

  1. xml的设计宗旨是传输数据,而不是显示数据。
  2. xml 标签没有被预定义。您需要自行定义标签。
  3. xml 被设计为具有自我描述性。

xml的用途:

  • xml 把数据从 html 分离
  • xml 简化数据共享
  • xml 简化数据传输
  • xml 简化平台变更
  • xml 使您的数据更有用
  • xml 用于创建新的互联网语言

xml文件语法

xml文件的语法规则很简单主要包括以下几点:

  1. xml 文档必须有根元素

xml 必须包含根元素,它是所有其他元素的父元素,如以下实例中 root 就是根元素:


  
    .....
  

  1. xml 声明

xml 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:


  1. 所有的 xml 元素都必须有一个关闭标签,但声明可以没有关闭标签

this is a paragraph.

  1. xml 标签对大小写敏感

xml 标签对大小写敏感。标签 与标签 是不同的。必须使用相同的大小写来编写打开标签和关闭标签:

message>这是错误的
这是正确的
  1. xml 必须正确嵌套
this text is bold and italic
  1. xml 属性值必须加引号

tove
jani


tove
jani

在上面两个xml文档中,第一个是错误的,第二个是正确的。

您如需了解更多关于xml文件的相关信息,可以到菜鸟教程学习相关知识。
在上面我介绍xml文件相关知识也都参考了该网站,有关知识介绍的都很全。

在了解完xml文件的相关知识后,我们就可以开始进行xml文件的解析工作了。我们可以利用现成开源的库来帮助我们解析xml文件,目前比较好用的库就是tinyxml2,只有两个文件分别是.h文件和.cpp文件。tinyxml2相关的库可以再网上很容易下到,也可以到我的github下载相关的库文件,网址如下:tinyxml2文件库下载
这个库里面也有两个相关的例子。
把库下好之后,就可以进行配置了,tinyxml2配置相比于jsoncpp容易很多,就只有两步:

  1. 把库文件导入到项目工程中。如图所示:

    2.在代码头文件中引入头文件和命名空间
#include "tinyxml2.h"
using namespace tinyxml2;

配置好库之后就可以依赖库创建xml文件了,先贴代码:

void  createcodexml()
{
  
	xmldocument xml;
	//插入声明
	xmldeclaration* declaration = xml.newdeclaration();
	xml.insertfirstchild(declaration);
	//插入根节点
	xmlelement* rootnode = xml.newelement("wang");
	xml.insertendchild(rootnode);
	//新建一个name节点
	xmlelement* root_1_name = xml.newelement("name");
	//新建name节点的文本wangqinghe
	//xmltext* text_1_name = xml.newtext("wangqinghe");
	把文本与name节点链接起来
	//root_1_name->insertfirstchild(text_1_name);
	//新建一个age节点
	xmlelement* root_1_age = xml.newelement("age");
	xmltext* text_1_age = xml.newtext("18");
	root_1_age->setattribute("age", "secret");
	root_1_age->insertfirstchild(text_1_age);
	//创建name节点的子节点
	xmlelement* root_2_gender = xml.newelement("gender");
	xmltext* text_2_gender = xml.newtext("man");
	root_2_gender->insertfirstchild(text_2_gender);
	//将gender节点变为name节点的子节点
	root_1_name->insertendchild(root_2_gender);
	//链接name节点与根节点
	rootnode->insertendchild(root_1_name);
	rootnode->insertendchild(root_1_age);
	xml.savefile("wang.xml");
}

首先构造一个xml文档:

xmldocument xml;

插入声明:

//插入声明
	xmldeclaration* declaration = xml.newdeclaration();
	xml.insertfirstchild(declaration);

插入声明后先插入一个根节点:“wang”

//插入根节点
	xmlelement* rootnode = xml.newelement("wang");
	xml.insertendchild(rootnode);

新建一个name节点:

xmlelement* root_1_name = xml.newelement("name");

创建name节点的子节点“gender”,文本内容为“man”,此时两者还没关系。

xmlelement* root_2_gender = xml.newelement("gender");
	xmltext* text_2_gender = xml.newtext("man");
	root_2_gender->insertfirstchild(text_2_gender);

把节点“gender”设置为节点“name”的子节点

root_1_name->insertendchild(root_2_gender);

新建一个age 节点,文本内容为18:

xmlelement* root_1_age = xml.newelement("age");
xmltext* text_1_age = xml.newtext("18");
root_1_age->setattribute("age", "secret");
root_1_age->insertfirstchild(text_1_age);

把name节点和age节点设置为根节点的子节点,到此所有的节点都连接完毕:

rootnode->insertendchild(root_1_name);
rootnode->insertendchild(root_1_age);

最后保存文件,文件名为wang.xml:

xml.savefile("wang.xml");

至此就已经创建好一个简单的xml文件了,文件内容如下:



    
        man
    
    18

xml文件创建完毕。

创建完xml文件之后,我们就可以根据xml的文件格式来解析对应的xml文件。先放代码:

void decodexml()
{
  
	//声明
	xmldocument xml;
	//导入xml文件
	if (xml.loadfile("wang.xml") != xml_success)
	{
  
		return;
	}
	//判断头文件是否为空
	xmlelement* rootnode = xml.rootelement();
	if (rootnode == null)
	{
  
		return;
	}
	
	//读取第一层信息
	xmlelement* root_1_name = rootnode->firstchildelement("name");
	//读取第二层信息
	xmlelement* root_2_gender = root_1_name->firstchildelement("gender");
	//信息输出
	string text_gender = root_2_gender->gettext();
	cout << "gender: "<firstchildelement("age");
	const xmlattribute* att_1_age = root_1_age->firstattribute();
	cout << att_1_age->name() << ":" << att_1_age->value() << endl;
	string text_age = root_1_age->gettext();
	cout << "age: " << text_age << endl;
}

读取信息的代码比较简单,通过注释应该能轻易理解,读取的文件就是我们上面生成的xml文件。
总的代码如下:

#include   
#include"tinyxml2.h"  
using namespace std;
using namespace tinyxml2;
void example2()
{
  
    xmldocument doc;
    doc.loadfile("test.xml");
    xmlelement* scene = doc.rootelement();
    xmlelement* surface = scene->firstchildelement("node");
    while (surface)
    {
  
        xmlelement* surfacechild = surface->firstchildelement();
        const char* content;
        const xmlattribute* attributeofsurface = surface->firstattribute();
        cout << attributeofsurface->name() << ":" << attributeofsurface->value() << endl;
        while (surfacechild)
        {
  
            content = surfacechild->gettext();
            surfacechild = surfacechild->nextsiblingelement();
            cout << content << endl;
        }
        surface = surface->nextsiblingelement();
    }
}
int main()
{
  
    example2();
    return 0;
}

另一种解析xml文件的代码:
首先是要解析的文件:



	
		0 10 10
		0 0 -1
		0 1 0
		90
	
	
		
0 10 -10
10
0 10 -10 10

对应代码:

#include   
#include"tinyxml2.h"  
using namespace std;
using namespace tinyxml2;
void example2()
{
  
    xmldocument doc;
    doc.loadfile("test.xml");
    xmlelement* scene = doc.rootelement();
    xmlelement* surface = scene->firstchildelement("node");
    while (surface)
    {
  
        xmlelement* surfacechild = surface->firstchildelement();
        const char* content;
        const xmlattribute* attributeofsurface = surface->firstattribute();
        cout << attributeofsurface->name() << ":" << attributeofsurface->value() << endl;
        while (surfacechild)
        {
  
            content = surfacechild->gettext();
            surfacechild = surfacechild->nextsiblingelement();
            cout << content << endl;
        }
        surface = surface->nextsiblingelement();
    }
}
int main()
{
  
    example2();
    return 0;
}
网站地图