XML的概念及其使用

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其实是一种标准,通过这种标准可以很容易的处理带有组织结构性质类型的数据。通过XML来处理以上的数据,最终可以采用如下所示的方式表达:


    
    

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

XML的基本组成是元素节点,一个元素节点可以具有属性,子元素节点,其中元素节点的范围以来表示,如上图所示,... 表示F22的元素节点,就表示Missile1的元素节点,其中Missile1是F22的子元素节点。其实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

 

你可能感兴趣的:(XML,C/C++)