zoukankan      html  css  js  c++  java
  • TinyXML解析

    TinyXML介绍

    最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。

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

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

    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的一些操作。

    下载和编译

    下载地址:http://sourceforge.net/projects/tinyxml/

    工作目录为:

    tinyxml/           //工作目录
    |-- include        //头文件根目录
    |  |-- tinyxml    //tinyxml头文件,包括tinystr.h tinyxml.h
    |-- src            //cpp源码文件根目录
      |-- tinyxml       //tinyxml源码文件夹,包括tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp
      |-- main.cpp   //我们的主函数,调用tinyxml的示例代码  
    |-- conf            //我们示例中用的xml文件所在的文件夹
    |-- makefile       //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践

    简单的例子

    在conf目录下建立student.xml代码

    <School name="软件学院">
        
        <Class name = "C++">  
            
            <Student name="tinyxml" number="123">  
                <email>tinyxml@163.com</email>  
                <address>中国</address>           
            </Student>  
            
            <Student name="jsoncpp" number="456">  
                <email>jsoncpp@gmail.com</email>  
                <address>美国</address>           
            </Student>  
            
        </Class>  
        
    </School>
    想要使用tinyxml,只需要在头文件中包含<tinyxml.h>即可

    读取整个xml文件并打印代码:

    void printSchoolXml() {
        using namespace std;
        TiXmlDocument doc;  
        const char * xmlFile = "conf/school.xml";   
        if (doc.LoadFile(xmlFile)) {    
            doc.Print();  
        } else {
            cout << "can not parse xml conf/school.xml" << endl;
        }   
    }

    读取XML

    void readSchoolXml() {
        using namespace std;
        const char * xmlFile = "conf/school.xml";
        TiXmlDocument doc;                              
        if (doc.LoadFile(xmlFile)) {
            doc.Print();
        } else {
            cout << "can not parse xml conf/school.xml" << endl;
            return;
        }
        
        TiXmlElement* rootElement = doc.RootElement();  //School元素  
        TiXmlElement* classElement = rootElement->FirstChildElement();  // Class元素
        TiXmlElement* studentElement = classElement->FirstChildElement();  //Students  
        
        for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) {
            TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute();  //获得student的name属性  
            for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) {
                cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;       
            }                                 
    
            TiXmlElement* studentContactElement = studentElement->FirstChildElement();//获得student的第一个联系方式 
            
            for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {
                string contactType = studentContactElement->Value();
                string contactValue = studentContactElement->GetText();
                cout << contactType  << " : " << contactValue << std::endl;           
            }   
        } 
    }

    写入xml

    void writeSchoolXml() {
        using namespace std;
        const char * xmlFile = "conf/school-write.xml"; 
        
        TiXmlDocument doc;  
        TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");  
        TiXmlElement * schoolElement = new TiXmlElement( "School" );  
        TiXmlElement * classElement = new TiXmlElement( "Class" );  
        classElement->SetAttribute("name", "C++");
    
        TiXmlElement * stu1Element = new TiXmlElement("Student");
        stu1Element->SetAttribute("name", "tinyxml");
        stu1Element->SetAttribute("number", "123");
        TiXmlElement * stu1EmailElement = new TiXmlElement("email");
        stu1EmailElement->LinkEndChild(new TiXmlText("tinyxml@163.com") );
        TiXmlElement * stu1AddressElement = new TiXmlElement("address");
        stu1AddressElement->LinkEndChild(new TiXmlText("中国"));
        stu1Element->LinkEndChild(stu1EmailElement);
        stu1Element->LinkEndChild(stu1AddressElement);
    
        TiXmlElement * stu2Element = new TiXmlElement("Student");
        stu2Element->SetAttribute("name", "jsoncpp");
        stu2Element->SetAttribute("number", "456");
        TiXmlElement * stu2EmailElement = new TiXmlElement("email");
        stu2EmailElement->LinkEndChild(new TiXmlText("jsoncpp@163.com"));
        TiXmlElement * stu2AddressElement = new TiXmlElement("address");
        stu2AddressElement->LinkEndChild(new TiXmlText("美国"));
        stu2Element->LinkEndChild(stu2EmailElement);
        stu2Element->LinkEndChild(stu2AddressElement);
    
        classElement->LinkEndChild(stu1Element);  
        classElement->LinkEndChild(stu2Element);  
        schoolElement->LinkEndChild(classElement);  
        
        doc.LinkEndChild(decl);  
        doc.LinkEndChild(schoolElement); 
        doc.SaveFile(xmlFile);  
    }

    XML删除操作

    删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、TiXmlDocument的基类

    TiXmlNode node;
    node.Clear();
    从A节点上移除子节点B
    TiXmlNode nodeA;
    nodeA. RemoveChild( TiXmlNode* removeThis );
    从元素A上移除名字为B的属性
    TiXmlAttribute attrA;
    attrA. RemoveAttribute( const char * name );

    XML修改操作

    查找内容为<mfid val="1234" />,现需要将1234改成其他值

    TiXmlNode* lpnode = NULL;
    lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode);
    TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute();
    //找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的
    tiattr->SetValue(mfid.c_str());
    替换一个节点
    TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );

    【参考文章】:[https://www.cnblogs.com/ggjucheng/archive/2012/01/03/2311426.html]

  • 相关阅读:
    linux php.ini又一次载入问题
    String、StringBuilder、 StringBuffer 深入分析 源代码解析
    hdu 4902 Nice boat(线段树区间改动,输出终于序列)
    鸿雁电器oa系统中决策支持模块效果
    POJ3321:Apple Tree(树状数组)
    ASP.NET六大巨头——内置对象(1)
    insmod hello.ko -1 Invalid module format最简单的解决的方法
    poj
    iOS项目开发实战——制作视图的缩放动画
    读配置文件能够保持顺序的 Java Properties 类
  • 原文地址:https://www.cnblogs.com/WindSun/p/11291515.html
Copyright © 2011-2022 走看看