zoukankan      html  css  js  c++  java
  • TinyXML 的简单介绍以及使用

    先说几句重点:

    1,tinyxml 生成或解析XML非常好用

    2,tinyxml 利用DOM(文档对象模型)操作XML,根节点与各个子节点相当于形成一棵树

    3,只要了解tinyxml的用法,可以只new对象而不用delete。

    4,tinyxml包含6个文件  tinystr.cpp , tinystr.h , tinyxml.cpp , tinyxmlerror.cpp , tinyxml.h , tinyxmlparser.cpp

    5,来个官网说明的class  inheritance,官网地址:http://www.grinninglizard.com/tinyxmldocs/index.html

    This inheritance list is sorted roughly, but not completely, alphabetically:

    直接上程序,只要看完代码,就会处理最简单的XML文档了

    #include <stdio.h>
    #include "tinyxml.h"
    
    int CreateXml()
    {
        //创建一个XML结构
        TiXmlDocument*  pDoc = new TiXmlDocument();
        //创建一个根节点并连接到XML
        TiXmlElement* pRoot = new TiXmlElement("item");
        pDoc->LinkEndChild(pRoot);
        //创建一个name子节点并连接根节点下
        TiXmlElement* nameElement = new TiXmlElement("name");
        pRoot->LinkEndChild(nameElement);
        nameElement->SetAttribute("ID","1");
        TiXmlText* nameContent = new TiXmlText("opop");
        nameElement->LinkEndChild(nameContent);
    
        TiXmlElement* addrElement = new TiXmlElement("addr");
        pRoot->LinkEndChild(addrElement);
        TiXmlText* addrContent = new TiXmlText("guangzhou");
        addrElement->LinkEndChild(addrContent);
    
        TiXmlElement* telElement = new TiXmlElement("tel");
        pRoot->LinkEndChild(telElement);
        TiXmlText* telContent = new TiXmlText("1341532545");
        telElement->LinkEndChild(telContent);
    
        TiXmlElement* emailElement = new TiXmlElement("email");
        pRoot->LinkEndChild(emailElement);
        TiXmlText* emailContent = new TiXmlText("opop@qq.com");
        emailElement->LinkEndChild(emailContent);
        //保存到文件
        pDoc->SaveFile("test.xml");
        delete pDoc; //应该是必要的
        return 0;
    
    }
    
    int ReadXml()
    {
        //创建一个XML结构并载入文件内容
        TiXmlDocument* pDoc = new TiXmlDocument();
        pDoc->LoadFile("test.xml");
        pDoc->Print();
        //获取根节点
        TiXmlElement* pRoot = pDoc->RootElement();
        printf("%s
    ",pRoot->Value());
        //获取根节点下的子节点并打印其内容
        TiXmlElement* pChild = pRoot->FirstChildElement("name");
        printf("%s
    ",pChild->FirstChild()->ToText()->Value());
    
        pChild = pRoot->FirstChildElement("addr");
        printf("%s
    ",pChild->FirstChild()->ToText()->Value());
    
        pChild = pRoot->FirstChildElement("tel");
        printf("%s
    ",pChild->FirstChild()->ToText()->Value());
    
        pChild = pRoot->FirstChildElement("email");
        printf("%s
    ",pChild->FirstChild()->ToText()->Value());
    
        delete pDoc;//应该是必要的
    } 

    int main() { CreateXml(); ReadXml(); return 0; }

    结果如下:

    最后再说一个重点:关于delete的问题

    先看下面一段官方代码:只有new,没有delete

    void write_simple_doc2( )
    {
        // same as write_simple_doc1 but add each node
        // as early as possible into the tree.
    
        TiXmlDocument doc;
        TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
        doc.LinkEndChild( decl );
        
        TiXmlElement * element = new TiXmlElement( "Hello" );
        doc.LinkEndChild( element );
        
        TiXmlText * text = new TiXmlText( "World" );
        element->LinkEndChild( text );
        
        doc.SaveFile( "madeByHand2.xml" );
    }

    Both of these produce the XML:

    <?xml version="1.0" ?>
    <Hello>World</Hello>

    对比完就发现了,只要代码中TiXmlDocument 对象不要在堆中new,直接在栈中生成,那么,就不需要任何delete操作,而且必须不能delete,否则就出问题了。

    原因很简单,只要TiXmlDocument 对象这个基本结构被销毁了,所有的节点会被自动销毁,源代码实现了该功能

    所以,使用时只要保证TiXmlDocument  类型的对象正确被释放就可以了

  • 相关阅读:
    使用bash编写Linux shell脚本参数和子壳
    开发项目的简单流程(需求、数据库、编码)
    hadoop和Hive的数据处理流程
    数据分析
    模糊聚类分析的实现
    贝叶斯1
    代理猎手
    贝叶斯2
    模糊聚类算法(FCM)和硬聚类算法(HCM)的VB6.0实现及
    C++模板
  • 原文地址:https://www.cnblogs.com/nanqiang/p/8405606.html
Copyright © 2011-2022 走看看