广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ TinyXML解析案例详解
  • 273
分享到

C++ TinyXML解析案例详解

2024-04-02 19:04:59 273人浏览 安东尼
摘要

目录TinyXML介绍TinyXML类说明下载和编译简单的例子读取XML写入xmlXML删除操作XML修改操作TinyXML介绍 最近做一个负载均衡的小项目,需要解析xml配置文件,

TinyXML介绍

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

TinyXML是一个开源的解析XML的解析库,能够用于c++,能够在windowslinux中编译。这个解析库的模型通过解析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 );

到此这篇关于C++ TinyXML解析案例详解的文章就介绍到这了,更多相关C++ TinyXML解析内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ TinyXML解析案例详解

本文链接: https://www.lsjlt.com/news/132942.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ TinyXML解析案例详解
    目录TinyXML介绍TinyXML类说明下载和编译简单的例子读取XML写入xmlXML删除操作XML修改操作TinyXML介绍 最近做一个负载均衡的小项目,需要解析xml配置文件,...
    99+
    2022-11-12
  • C++使用TinyXML解析XML
    目录1.介绍2.TinyXML配置3.TinyXML读取和保存文件3.1 读取xml文件3.2 读取xml参数3.3 保存xml参数到文本3.4 保存xml参数到临时变量4.Tiny...
    99+
    2022-11-12
  • C++怎么使用TinyXML解析XML
    这篇文章主要介绍“C++怎么使用TinyXML解析XML”,在日常操作中,相信很多人在C++怎么使用TinyXML解析XML问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么使用TinyXML解析XML...
    99+
    2023-06-22
  • C++ LARGE_INTEGER解析与使用案例详解
    这里解释前面碰到的LARGE_INTEGER结构。与可能的误解不同,64位数据并非要在64位操作系统下才能使用。在VC中,64位数据的类型为__int64。定义写法如下: ...
    99+
    2022-11-12
  • C# TreeNode案例详解
    目录添加节点删除修改方法1:方法二:添加节点 private void Form1_Load(object sender, EventArgs e) { tree...
    99+
    2022-11-12
  • C++ namespace案例详解
    在C++语言编写的程序中,变量和函数等的作用范围是有一定限制的。比如,在函数体中定义的一个临时变量就不可以在函数体外使用。为了解决变量和函数等的作用范围,在C++语言中引入了名空间的...
    99+
    2022-11-12
  • C# Assembly.Load案例详解
     我们在使用C# 语言的Assembly.Load 来加载托管程序集并使用反射功能时,一般需要先通过Assembly.Load(), Assembly.LoadFrom()...
    99+
    2022-11-12
  • C++中TinyXML读取xml文件用法详解
    目录前言XML文件理解常用的XML类方法使用总结前言 TinyXML下载地址:https://sourceforge.net/projects/tinyxml/ 官方文档:TinyX...
    99+
    2022-11-13
  • C# MemoryStream类案例详解
    MemoryStream位于System.IO命名空间,为系统内存提供流式的读写操作。常作为其他流数据交换时的中间对象操作。 MemoryStream类封装一个字节数组,在...
    99+
    2022-11-12
  • C# CultureInfo类案例详解
    c#中的CultureInfo类 CultureInfo类位于System.Globalization命名空间内,这个类和命名空间许多人都不是很熟悉,实际我们在写程序写都经常间接性的...
    99+
    2022-11-12
  • C# PropertyInfo类案例详解
    对一个对象进行属性分析,并得到相应的属性值,并判断属性的默认值以及空值 public class People { public string name...
    99+
    2022-11-12
  • C#的TimeSpan案例详解
    TimeSpan结构:表示一个时间间隔。 它含有以下四个构造函数: TimeSpan(Int64)将 TimeSpan结构的新实例初始化为指定的刻度数。 ...
    99+
    2022-11-12
  • C++ QgraphicsScene类案例详解
    概述 QgraphicsScene类为管理大量的2D图形item提供了一个管理界面,做为item的容器,它配合使用QgraphicsView使用来观察items,例如线,矩形,文本或...
    99+
    2022-11-12
  • C++ 匈牙利算法案例分析详解
    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用...
    99+
    2022-11-12
  • C# Directory.GetFiles()函数案例详解
    C#中Directory.GetFiles() 函数的使用 C#中Directory.GetFiles(string path , string searchPattern, Sea...
    99+
    2022-11-12
  • C# PropertyGrid使用案例详解
    1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过Descripti...
    99+
    2022-11-12
  • C# AttributeUsage使用案例详解
    C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们...
    99+
    2022-11-12
  • C++ WideCharToMultiByte()函数案例详解
    函数WideCharToMultiByte() 详解 函数原型: int WideCharToMultiByte( UINT CodePage, DWORD dwFla...
    99+
    2022-11-12
  • C++ cin.get用法案例详解
    与字符串输入一样,有时候使用 cin>> 读取字符也不会按我们想要的结果行事。 例如,因为它会忽略掉所有前导白色空格,所以使用 cin>> 就不可能仅输入一个...
    99+
    2022-11-12
  • C++ move()函数案例详解
    要了解move函数首先弄清左值引用和右值引用。 左值、左值引用、右值、右值引用 1、左值和右值的概念         左值是可以放在赋值号左边...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作