zoukankan      html  css  js  c++  java
  • C++ XML解析之TinyXML篇[转]

    最 近使用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的一些操作。
     
    本文出自 “C++技术” 博客,请务必保留此出处http://panpan.blog.51cto.com/489034/104961
  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/3783873.html
Copyright © 2011-2022 走看看