信息发布软件,b2b软件,广告发布软件

标题: C++ XML约会时间到直观解析TinyXML篇多实例申明 [打印本页]

作者: 群发软件    时间: 2017-6-23 23:25
标题: C++ XML约会时间到直观解析TinyXML篇多实例申明

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

如下是一个XML片段:
file:///C:/Users/MHAPDR~1/AppData/Local/Temp/enhtmlclip/Image.gif   <Persons>
        
<Person ID="1">
            
<name>周星星</name>
            
<age>20</age>
        
</Person>
        
<Person ID="2">
            
<name>白晶晶</name>
            
<age>18</age>
        
</Person>
   
</Persons>

在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。。。

对应的XML文件:
<Persons>
   
<Person ID="1">
        
<name>phinecos</name>
        
<age>22</age>
   
</Person>
</Persons>

读写XML文件的程序代码:

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

CString GetAppPath()
file:///C:/Users/MHAPDR~1/AppData/Local/Temp/enhtmlclip/Image(1).gif
{//获取应用程序根目录
file:///C:/Users/MHAPDR~1/AppData/Local/Temp/enhtmlclip/Image(2).gif    TCHAR modulePath[MAX_PATH];
    GetModuleFileName(NULL, modulePath, MAX_PATH);
    CString strModulePath(modulePath);
    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
    return strModulePath;
file:///C:/Users/MHAPDR~1/AppData/Local/Temp/enhtmlclip/Image(3).gif}


bool CreateXmlFile(string& szFileName)
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
    try
file:///C:/Users/MHAPDR~1/AppData/Local/Temp/enhtmlclip/Image(4).gif    {
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument();
        //创建一个根元素并连接。
        TiXmlElement *RootElement = new TiXmlElement("Persons");
        myDocument->LinkEndChild(RootElement);
        //创建一个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("22");
        NameElement->LinkEndChild(NameContent);
        AgeElement->LinkEndChild(AgeContent);
        CString appPath = GetAppPath();
        string seperator = "\\";
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
        myDocument->SaveFile(fullPath.c_str());//保存到文件
file:///C:/Users/MHAPDR~1/AppData/Local/Temp/enhtmlclip/Image(5).gif    }
    catch (string& e)
    {
        return false;
    }
    return true;
}


bool ReadXmlFile(string& szFileName)
{//读取Xml文件,并遍历
    try
    {
        CString appPath = GetAppPath();
        string seperator = "\\";
        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
        myDocument->LoadFile();
        //获得根元素,即Persons。
        TiXmlElement *RootElement = myDocument->RootElement();
        //输出根元素名称,即输出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内容,即;ID属性,即。
        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);

}

C++ XML约会时间到直观解析TinyXML篇多实例申明 b2b软件

写本文的目的是为了方便大家了解C++ MSXML操作方法。

当然,C++中对MSXML的调用有多种,本文采用的方法是完全参照MSXML SDK提供的文档进行操作。

如果有什么错误,欢迎指正。


代码框架是基于vs2008 MFC 对话框程序(UNICODE)。对话框程序需要读者自己创建。


[cpp] view plain copy





a.xml



[xhtml] view plain copy



 最近使用TinyXML进行C++ XML解析,感觉使用起来比较简单,很容易上手,本文给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。以后的文章里会讲解使用Xerces进行C++ XML解析的例子,希望大家一起交流。

  TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

  DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

  首先从网上下载TinyXML的库,文件夹的名字是TinyXpath,在工程里做如下配置:

  在附加包含路径里添加:你的tinyxpath路径/tinyxpath/include

  在附加库路径里添加:你的tinyxpath路径/tinyxpath/lib

  在对象/库路径里添加:tinyxpathd.lib,如果使用release版本,则是tinyxpath.lib。

  另外,由于我开发的项目是多线程的,所以设置了多线程的环境,因此使用TinyXML没有出现问题。本人将TinyXML写在一个单独的C++工程进行测试,发现如果不设置多线程的环境,会出现链接错误。我觉得原因可能是TinyXML使用了多线程环境,因此需要设置多线程的环境。在工程/设置下的C/C++选项卡中,选择Code Generation,在Use run-time library中选择Debug MultiThreaed DLL即可。

  本例的XML文件Students.xml如下:

  <Class name="计算机软件班">

  <Students>

  <student name="张三" studentNo="13031001" sex="男" age="22">

  <phone>88208888</phone>

  <address>西安市太白南路二号</address>

  </student>

  <student name="李四" studentNo="13031002" sex="男" age="20">

  <phone>88206666</phone>

  <address>西安市光华路</address>

  </student>

  </Students>

  </Class>

  程序代码XmlParseExample.cpp如下所示:

  #include <iostream>

  #include <string>

  #include <tinyxml.h>

  using std::string;

  int main()

  {

  TiXmlDocument* myDocument = new TiXmlDocument();

  myDocument->LoadFile("Students.xml");

  TiXmlElement* rootElement = myDocument->RootElement(); //Class

  TiXmlElement* studentsElement = rootElement->FirstChildElement(); //Students

  TiXmlElement* studentElement = studentsElement->FirstChildElement(); //Students

  while ( studentElement ) {

  TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //获得student的name属性

  while ( attributeOfStudent ) {

  std::cout 《 attributeOfStudent->Name() 《 " : " 《 attributeOfStudent->Value() 《 std::endl;

  attributeOfStudent = attributeOfStudent->Next();

  }

  TiXmlElement* phoneElement = studentElement->FirstChildElement();//获得student的phone元素

  std::cout 《 "phone" 《 " : " 《 phoneElement->GetText() 《 std::endl;

  TiXmlElement* addressElement = phoneElement->NextSiblingElement();

  std::cout 《 "address" 《 " : " 《 phoneElement->GetText() 《 std::endl;

  studentElement = studentElement->NextSiblingElement();

  }

  return 0;

  }

  程序运行结果如下:

  name : 张三

  studentNo : 13031001

  sex : 男

  age : 22

  phone : 88208888

  address : 88208888

  name : 李四

  studentNo : 13031002

  sex : 男

  age : 20

  phone : 88206666

  address : 88206666

  本例中使用的是对xml文件进行解析,很容易掌握,但是很多开发人员不知道如何对xml 字符流(非xml文件)进行解析,我看了TinyXML提供的源代码,里面可以使用如下方法对xml流解析。对应于上例,代码如下:

  string xmlString =

  "<Class name=\"计算机软件班\">

  <Students>

  <student name=\"张三\" studentNo=\"13031001\" sex=\"男\" age=\"22\">

  <phone>88208888</phone>

  <address>西安市太白南路二号</address>

  </student>

  <student name=\"李四\" studentNo=\"13031002\" sex=\"男\" age=\"20\">

  <phone>88206666</phone>

  <address>西安市光华路</address>

  </student>

  </Students>

  </Class>";

  TiXmlDocument* myDocument = new TiXmlDocument();

  myDocument->Parse(xmlString.c_str());

  使用Parse函数就可以解析XML字符流了,这是很多开发者不太熟悉的情况。

  如果开发者开发特定应用,就可以使用上述类似方法,可能不需要完全处理每一个属性,比如可以对属性名进行判断,只处理自己需要的属性,或者自己需要的xml元素。还可以使用TinyXML的方法创建xml元素和xml属性,或者设置xml元素和属性对应的值,等等,如果读者想要类似的例子,可以留言写出。

  下面介绍TinyXML的一些类。在TinyXML中,根据XML的各种元素来定义了一些类:

  TiXmlBase:整个TinyXML模型的基类。

  TiXmlAttribute:对应于XML中的元素的属性。

  TiXmlNode:对应于DOM结构中的节点。

  TiXmlComment:对应于XML中的注释

  TiXmlDeclaration:对应于XML中的申明部分,<?versiong="1.0" ?>。

  TiXmlDocument:对应于XML的整个文档。

  TiXmlElement:对应于XML的元素。

  TiXmlText:对应于XML的文字部分

  TiXmlUnknown:对应于XML的未知部分。

  TiXmlHandler:定义了针对XML的一些操作。


作者: nidalma001    时间: 2017-6-24 19:15
的细心指导和安装,服务热情周到,很好很成功的一次网购,我还会再来的!
作者: aluoting    时间: 2017-6-27 00:14
,很高端的视觉效应,很耐心,设计的很不错,高端大气上档次啊!技术人员很给力,专业的就是专业的,为卖家耐心热
作者: xubaojin    时间: 2017-6-27 00:14
果不错
作者: mmgg    时间: 2017-7-2 07:49
是只是做了后台,其他内容都需要自己填充,不过给了技术顾问,很耐心的教怎么弄,因为这个东西以后毕竟都需要自己来弄,还是很赞的说,
作者: 万能群发    时间: 2017-7-2 11:33
,技术也不错的,说实在的。很快就能搞定
作者: lnzhanghao    时间: 2017-7-4 10:16
客服姐姐晨曦都值得表扬,加班加点很敬业修改了10几次,都依依解决。最后都非常满意,现在像这种有问题能随时改正
作者: xubaojin    时间: 2017-7-6 22:09
务很热心哦!非常感谢!值得推荐,效果不错。还有一个店铺需要设计,以后就决定你家了
作者: lalajie    时间: 2017-7-9 14:12
晒下,也算打个广告好了
作者: mmgg520    时间: 2017-7-10 18:50
间做完,还不错,客服态度也好
作者: meilifc001    时间: 2017-7-11 20:57
路过,支持一下啦
作者: zdxhz    时间: 2017-7-11 21:36
家,技术经验都很精湛,物超所值,值得推荐!
作者: daoke    时间: 2017-7-11 21:56
很全喔,这个价格也是给力,总之物超所值哈
作者: brt02    时间: 2017-7-13 01:56
有创意了,设计出来的样式很符合我们想要的风格,画面精美,做出来的效果不错,谢谢店家的耐心服务,很满意。
作者: 发财猪    时间: 2017-7-13 08:05
,整体满意,好评
作者: niyaoz1    时间: 2017-7-18 05:25
。服务非常好。
作者: meili1    时间: 2017-7-18 18:57
好,与卖家描述的完全一致,非常满意
作者: xubaojin    时间: 2017-7-19 20:58
酷很霸气哦!服务真的真的很好哟~~赞一个,还会推荐其他商家来的哦~~棒
作者: meng00123    时间: 2017-7-20 09:45
推荐!
作者: zdxhz    时间: 2017-7-20 14:30
不太了解的我,抱着试试的态度开始了第一次的合作,没有想到效果非常不错,在沟通的过程中,我也学会了很多装修知识,不仅店铺漂亮了,还交到了个朋友,不错不错!
作者: shenyeben    时间: 2017-7-23 00:07
位,修改的速度很快。




欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) Powered by Discuz! X3.2