欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XML的概念及其使用

程序员文章站 2022-07-14 12:40:51
...

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来处理以上的数据,最终可以采用如下所示的方式表达:

<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

 

相关标签: XML TinyXML