XML学习

来源:互联网 发布:网站数据安全如何保证 编辑:程序博客网 时间:2024/06/06 00:23

今天突然需要用到文本协议,以前搞嵌入式的东西,都是用的二进制协议,没有用到文本协议,今天开始学习了一上午,感觉文本协议确实在制定上要方便了很多。但是效率上肯定不如二进制协议,但是二进制协议对于维护者来说还是比较困难的。

首先说说XML吧,下面说说我的简单理解,(具体的参考教程http://www.runoob.com/xml/xml-tutorial.html

XML是可扩展标记语言,是(eXtensible Markup Language)的缩写。XML用来传输数据和存储数据。

也就是说XML的基本概念,我们学什么东西都要从其概念入手:

 

<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body ID="1">
<!---ID=1代表说的第一句话--->
Don't forget me this weekend!
</body>
</note>
第一行是XML的声明,记住就行了,多了不解释。
标签:每一个<>都是一个标签。标签是一对尖括号和两者之间的内容,包括元素名和所有属性。
<body ID="1">是一个标签,</body> 也是一个标签。前者是开始标签,后者是结束标签。
元素:是开始标签、结束标签以及两者之间的所有内容,包括属性、注释、文本和子元素。
        子元素:<to>Tove</to>就是元素<note>的子元素。当然子元素还可以有子元素 ,通过嵌套关系就可以看出谁是谁的子元素。
         注释:<!   .....>代表注释,不解释了。
         属性::就是在开始标签里的<body ID="1">ID就是属性,1是属性值,属性值一定要用“”引上。
         文本:就是在开始标签和结束标签之间的东西。<to>Tove</to>Tove就是文本。
基本概念学完了,那么就是怎么把我们程序中的数据,组装成XML了,以及如何读取别人提供给我们的XML文件了。
首先小编写到这里,突然有一些感想,就是对待知识的一种学习方式,这当然和我的这段经历有关,我在学校期间,学习了三年的嵌入式,其实主要搞的是单片机,然后学习了简单的Linux操作系统基础知识,然后能够简单的移植修改字符设备驱动,给老师做过一些单片机项目,可能是搞C语言的原因吧,总是什么问题,都要追根问底,总感觉我做底层的东西最牛,感觉我做一个嵌入式设备,就要从画电路板,然后调试板子,自己焊片子,然后再写片子驱动,然后再调应用程序,再自己写客户端界面,那才算是真本事,后来在学校毕业后,一心想找嵌入式的工作,结果毕业后找到了一份在老家的工作,各种福利待遇都不错,但是却不能搞嵌入式了,要开始搞应用了。就是要从C语言转向C++语言,这个刚开始是特别的痛苦,比方说是STL学习的时候,老想去看map和Set的源码,碰见一个东西就想去看源码,我这里强调的一点是这个本身是没有错误,这种学习态度,但是对于公司来说,是以结果为导向的,或者是说我们做事都要讲究效率的,我们既然已经站在了巨人的肩旁上,那就是在这个基础上,再继续前进就可以了,既然别人已经把一些复杂的底层东西封装好了,那么我们就用就好了,我们想组装一个电脑,你就把显示器和主机里相关设备买完了组装一下就行了。你还非得去研究显卡是怎么工作了,然后你画板子把它做出来吗?所以一直以为自己原来的学习方式,有些闭塞,一些软件开发者耗费了大量的心血,把底层的东西封装好了,就是为了方便我们使用,我们在这上面开发就好了,所以面向对象的编程语言都是这样的,所以我们要习惯这种学习方式。(但是有些地方还是需要深究的)
 
刚才小编的思路有些跑偏,现在回到前文,当然XML的底层解析,以及组装XML,别人都给我们封装好了各种类库,我们直接用就可以了,我用过tinyXML感觉就不错,https://sourceforge.net/projects/tinyxml/这个是tinyxml的库文件的下载地址。
下载完之后把2个.h文件,和4个.cpp文件。放入到自己的工程目录下。然后写自己的源码就可以了,源代码粘贴如下:
我自己编写完了,是可以运行的

using namespace std;

#include <iostream>
#include "tinyxml.h"
#include "tinystr.h"
#include <string>
#include <windows.h>
#include <atlstr.h>
using namespace std;

string GetAppPath()
{//获取应用程序目录
   
    char moduleFileName[MAX_PATH];
    GetModuleFileNameA(NULL, moduleFileName, MAX_PATH);
    std::string workingFolder(moduleFileName);
    size_t pos = workingFolder.find_last_of("\\");
    workingFolder = workingFolder.substr(0, pos);
    std::cout << workingFolder << std::endl;

    return workingFolder;
   
}

bool CreateXmlFile(string& szFileName)
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
    try
    {
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument();
        //创建一个根元素并连接。
        TiXmlElement *RootElement = new TiXmlElement("Persons");
        myDocument->LinkEndChild(RootElement);//根元素连接到myDocument下。
        //创建一个Person元素并连接。
        TiXmlElement *PersonElement = new TiXmlElement("Person");
        RootElement->LinkEndChild(PersonElement);//原来是连接这里有文章啊,哈哈
        //设置Person元素的属性。
        PersonElement->SetAttribute("ID", "1");
        //创建name元素、age元素并连接。
        TiXmlElement *NameElement = new TiXmlElement("name");
        TiXmlElement *AgeElement = new TiXmlElement("age");
        PersonElement->LinkEndChild(NameElement);
        PersonElement->LinkEndChild(AgeElement);
        //设置name元素和age元素的内容并连接。
        TiXmlText *NameContent = new TiXmlText("麦蒂");
        TiXmlText *AgeContent = new TiXmlText("32");
        NameElement->LinkEndChild(NameContent);
        AgeElement->LinkEndChild(AgeContent);

 

        TiXmlElement *PersonElement1 = new TiXmlElement("Person");
        RootElement->LinkEndChild(PersonElement1);//原来是连接这里有文章啊,哈哈
        //设置Person元素的属性。
        PersonElement1->SetAttribute("ID", "2");
        //创建name元素、age元素并连接。
        TiXmlElement *NameElement1 = new TiXmlElement("name");
        TiXmlElement *AgeElement1 = new TiXmlElement("age");
        PersonElement1->LinkEndChild(NameElement1);
        PersonElement1->LinkEndChild(AgeElement1);
        //设置name元素和age元素的内容并连接。
        TiXmlText *NameContent1 = new TiXmlText("易建联");
        TiXmlText *AgeContent1 = new TiXmlText("28");
        NameElement1->LinkEndChild(NameContent1);
        AgeElement1->LinkEndChild(AgeContent1);


        TiXmlElement *PersonElement3 = new TiXmlElement("Person");
        RootElement->LinkEndChild(PersonElement3);//原来是连接这里有文章啊,哈哈
        //设置Person元素的属性。
        PersonElement3->SetAttribute("ID", "3");
        //创建name元素、age元素并连接。
        TiXmlElement *NameElement3 = new TiXmlElement("name");
        TiXmlElement *AgeElement3 = new TiXmlElement("age");
        PersonElement3->LinkEndChild(NameElement3);
        PersonElement3->LinkEndChild(AgeElement3);
        //设置name元素和age元素的内容并连接。
        TiXmlText *NameContent3 = new TiXmlText("姚明");
        TiXmlText *AgeContent3 = new TiXmlText("32");
        NameElement3->LinkEndChild(NameContent3);
        AgeElement3->LinkEndChild(AgeContent3);


        string appPath = GetAppPath();
        string seperator = "\\";
        string fullPath = appPath + seperator + szFileName;
        myDocument->SaveFile(fullPath.c_str());//保存到文件
    }
    catch (string& e)
    {
        return false;
    }
    return true;
}

bool ReadXmlFile(string& szFileName)
{//读取Xml文件,并遍历
    try
    {
        string appPath = GetAppPath();
        string seperator = "\\";
        string fullPath = appPath + seperator + szFileName;
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
        if (NULL == myDocument)
        {
            return false;
        }
        myDocument->LoadFile();
        //获得根元素,即Persons。
        TiXmlElement *RootElement = myDocument->RootElement();
        if (NULL == RootElement)
        {
            return false;
        }
        //输出根元素名称,即输出Persons。
        cout << RootElement->Value() << endl;
        //获得第一个Person节点。
        TiXmlElement *FirstPerson = RootElement->FirstChildElement();
        //获得第一个Person的name节点和age节点和ID属性。
        TiXmlElement *NameElement = FirstPerson->FirstChildElement();
        TiXmlElement *AgeElement = NameElement->NextSiblingElement();
        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
        //输出第一个Person的name内容,即周星星;age内容,即 22;ID属性,即ID="1"
        cout << NameElement->FirstChild()->Value() << endl;
        cout << AgeElement->FirstChild->Value() << endl;
        cout << IDAttribute->Value() << endl;
    }
    catch (string& e)
    {
        return false;
    }
    return true;
}
int main()
{
    string fileName = "info.xml";
    CreateXmlFile(fileName);
    ReadXmlFile(fileName);

}

 
 
 

 

0 0
原创粉丝点击