编程 - XML的概念及其使用

18 篇文章 0 订阅
1 篇文章 0 订阅

1、引言

在实际的项目开发中,有时为了传递大量且又有一些组织关系的数据时,选择何种格式来存储数据就是需要考虑的问题了。假设要传递一组数据,需要包含:飞机类型(F22),重量(20000kg),航程(10000km);同时该飞机下挂载了几种类型的导弹:导弹1(Misile1)、重量(100kg)、射程(100km),导弹2(Missile2)、重量(200kg)、射程(200km)。

一般在使用网络通信的方式传递数据时,基本上传递的都是字符串,当然这也是和通信协议相关的。自然而然的,就会想着用字符串的形式来组织并传递上面一组数据了,为了体现出来有组织关系,就要引入一些特殊字符,最终组成的字符串可能就是如下所示的形式了:

string str = "";
str = "F22-20000-10000>Missile1-100-100>Missile2-200-200";

当数据元素少的时候还勉强能理解字符串,特殊字符 - 表示一个对象,特殊字符 > 表示组成关系。但是当数据量多时,甚至有多层嵌套关系时,在继续采用这种方式,那简直就是在给自己找麻烦了,此时 选择一个合理的结构来存储以上数据就很有必要了,而XML就是一个比较好的选择。

2、XML的概念

XML:eXtensible Markup Language,可扩展标记语言。是一种标记任意类型的数据并使其具有结构性的一种标记语言,说它是一种语言,并不是我们常说的某种开发语言,XML其实是一种标准,通过这种标准可以很容易的处理带有组织结构性质类型的数据。

2.1、XML的格式要求

具体规则如下:

1、必须有声明语句

XML声明是XML文档的第一句,其格式如下: 

1

<?xml version="1.0" encoding="utf-8"?>

2、注意大小写

在XML文档中,大小写是有区别的。

3、XML文档有且只有一个根元素

良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。 

4、属性值使用引号

在XML中,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。

5、所有的标记必须有相应的结束标记

在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。 

6、所有的空标记也必须被关闭

空标记是指标记对之间没有内容的标记,比如“”等标记。在XML中,规定所有的标记必须有结束标记。 

通过XML来处理以上的数据,最终可以采用如下所示的方式表达:

<?xml version="1.0" encoding="utf-8"?>
<F22 weight="20000" range="10000">
    <Missile1 weight="100" range="100"/>
    <Missile2 weight="200" range="200"/>
</F22>

如上所示,通过XML的方式可以很清晰的体现出的数据之间的组成及结构关系,且有很清晰的描述每一个数据代表的意义。

XML的基本组成是元素节点,一个元素节点可以具有属性,子元素节点,其中元素节点的范围以</>来表示,如上图所示,</F22>...</F22> 表示F22的元素节点,<Missile1 ... />就表示Missile1的元素节点,其中Missile1是F22的子元素节点。其实Missile1的表达方式有两种,还有一种表达方式是<Missile1>...</Missile1>,当该元素节点没有子元素节点时,可以采用第一种表示方式,这样会是XML的结构更简洁。

每一个元素节点都具有对应的属性,属性的表现形式为 属性名称=“属性值”,一般是写在元素节点的 <...> 内,具体书写方式请参考上面所示的写法。

3、TinyXML

目前有很多XML的操作库,像libxml、tinyxml等,在这里主要介绍tinyxml的使用。

tinyxml是一款开源软件,主要包含了两个头文件和四个源文件,使用方式也很灵活,即可以直接添加到工程文件中,也可以做成动态库的形式添加到工程中。tinyxml是以C++语言进行编写的,具体的实现方式不在此讨论,感兴趣的可以自行查看。

4、使用TinyXML操作XML文件

下面就介绍以下tinyxml中常用的使用方法:

读取XML文件:

TiXmlDocument *myDocument = new TiXmlDocument();   //创建XML文件的对象

myDocument->LoadFile(xmlFilePath);         //将XML文件加载到XML文件的对象中,参数为XML文件路径

myDocument->Parse(xmlString);              //将字符串格式的XML文件的内容加载到XML文件对象中

TiXmlElement *rootElement = myDocument->RootElement();         //获取XML文件对象的根元素节点

TiXmlElement *childElement = rootElement->FirstChildElement(); //读取XNL文件根节点的第一个子节点

childElement = childElement->NextSiblingElement();     //读取下一个子节点

string elementValue = childElement->Value();           //获得元素节点的名称。比如:"F22"、"Missile1"等

string attributeValue = childElement->Attribute("AttrbibuteName");//读取元素节点的属性,其中参数为属性的名称

创建XML文件:

TiXmlDocument *newDocument = new TiXmlDocument();              //创建一个新的XML文件的对象
TiXmlElement *rootElement = new TiXmlElement("elementName");   //创建新的元素节点,根节点

newDocument->LinkEndChild(rootElement);             //将创建的新的元素节点添加到XML文件对象newDocument中

rootElement->SetAttribute("AttributeName", "AttributeValue");//设置新元素节点的属性,其中AttributeName表示属性的名称,AttributeValue表示属性的值

TiXmlElement *childElement = new TiXmlElement("elementName");//创建子元素节点
rootElement->LinkEndChild(childElement);          //为元素节点rootElement添加子元素节点

newDocument->SaveFile(xmlFilePath);               //将创建完成的XML保存成文件,其中xmlFilePath为保存路径

TiXmlPrinter *xmlPrinter = new TiXmlPrinter();    //将创建完成的XML文件保存成字符串形式
rootElement->Accept(xmlPrinter);
string xmlStr = xmlPrinter->CStr();               //转换成字符串

5、tinyxml的修改

由于tinyxml的开源特性,所以可以按照特定的要求修改tinyxml的源文件来实现类似于xml结构的文件的解析。基于任务的需要,需要完成对如下格式的文件的创建与解析:

(Fed
    (Class Aircraft_1
        (Attribute Position attr1 attr2)
    )
    (Class Aircraft_2
        (Attribute Positin attr2 attr3)
    )
    (Class Comm attr1 attr2
        (Parameter msg)
    )
        
)

通过观察可以发现,上图所示的文件结构与XML有诸多相似之处,所以,本人利用tinyxml的源文件,经过修改最终实现上图所示文件的解析。 

6、源文件下载

原始tinyxml源文件的下载地址:https://download.csdn.net/download/bailang_zhizun/10659571

修改后的tinyxml源文件的下载地址:https://download.csdn.net/download/bailang_zhizun/10659585

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值