zoukankan      html  css  js  c++  java
  • C++ XML解析之tinyXML

    最近使用TinyXML进行C++ XML解析,感觉使用起来比较简单,很容易上手,本文给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
    DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
    首先从网上下载TinyXML的库,文件夹的名字是TinyXpath,在工程里做如下配置:

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

    本人将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如下所示:

            程序运行结果如下:
     1  #include <iostream>
     2     #include <string>
     3     #include <tinyxml.h>
     4     using std::string;
     5     int main()
     6     {
     7     TiXmlDocument* myDocument = new TiXmlDocument();
     8     myDocument->LoadFile("Students.xml");
     9     TiXmlElement* rootElement = myDocument->RootElement();  //Class
    10 
    11     TiXmlElement* studentsElement = rootElement->FirstChildElement();  //Students
    12 
    13     TiXmlElement* studentElement = studentsElement->FirstChildElement();  //Students
    14 
    15     while ( studentElement ) {
    16     TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute();  //获得student的name属性
    17 
    18     while ( attributeOfStudent ) {
    19 
    20     std::cout 《 attributeOfStudent->Name() 《 " : " 《 attributeOfStudent->Value() 《 std::endl;
    21 
    22     attributeOfStudent = attributeOfStudent->Next();
    23 
    24     }
    25 
    26     TiXmlElement* phoneElement = studentElement->FirstChildElement();//获得student的phone元素
    27 
    28     std::cout 《 "phone"" : " 《 phoneElement->GetText() 《 std::endl;
    29 
    30     TiXmlElement* addressElement = phoneElement->NextSiblingElement();
    31 
    32     std::cout 《 "address"" : " 《 phoneElement->GetText() 《 std::endl;
    33 
    34     studentElement = studentElement->NextSiblingElement();
    35 
    36     }
    37 
    38     return 0;
    39 
    40     }
       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的一些操作
  • 相关阅读:
    aspnet_regiis.exe -i 报 “此操作系统版本不支持此选项”
    c# winform如何屏蔽键盘上下左右键
    六大设计原则
    hexo发布失败
    springboot静态资源添加版本号控制版本更新
    parallels desktop无法连接网络无法连接usb解决方法
    @RequestParam使用defaultValue属性设置默认值
    soar以及web页面安装使用
    windows平台下安装nodejs出错2503 2502
    iconfont图标使用
  • 原文地址:https://www.cnblogs.com/foundwant/p/2964694.html
Copyright © 2011-2022 走看看