c++中用TINYXML解析XML文件

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 );

以上就是c++中用TINYXML解析XML文件的详细内容,更多关于c++ tinyxml解析XML的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++生成和解析XML文件的讲解

    概述 1.xml 指可扩展标记语言(EXtensible Markup Language) 2.xml 是一种标记语言,类似html 3.xml 的设计宗旨是传输数据,而非显示数据 4.xml 标签没有被预定义.需要自行定义标签 XML与HTML区别 1.xml 不是 html 的替代. 2.xml 和 html 为不同的目的而设计: 3.xml 被设计为传输和存储数据,其焦点是数据的内容. 4.html 被设计用来显示数据,其焦点是数据的外观. 5.html 旨在显示信息,而 xml 旨在传输

  • C++调用迅雷接口解析XML下载功能(迅雷下载功能)

    迅雷下载库的网址:http://thunderplatform.xunlei.com 复制代码 代码如下: // FileName: Download.h#pragma once#include "lib\XLDownload.h"#include "lib\XLError.h"#include <vector> // 下载队列的大小,决定同时开启下载线程的数量const int LIMIT = 2; struct Down{    // 解析出来的下载

  • tinyxml 常用的C++ XML解析器非常优秀

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包

  • c++中用TINYXML解析XML文件

    TinyXML介绍 最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型

  • Android中使用sax解析xml文件的方法

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用

  • VC解析XML文件-CMarkup的使用详解

    VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等.据说tinyXML很好,可能字符集问题,我编译不了.所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便.CMarkup下载地址:http://www.firstobject.com/发现网上有方法很法,我就摘下来了 复制代码 代码如下: //----------UserInfo.xml--------------    xml version="1.0" encoding=&q

  • C++使用TinyXML解析XML

    目录 1.介绍 2.TinyXML配置 3.TinyXML读取和保存文件 3.1 读取xml文件 3.2 读取xml参数 3.3 保存xml参数到文本 3.4 保存xml参数到临时变量 4.TinyXML增删改查 4.1 增 4.2 删 4.3 改 4.4 查 1.介绍 Tinyxml的官方网址:http://www.grinninglizard.com 官方介绍文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html 在TinyXM

  • C++中TinyXML读取xml文件用法详解

    目录 前言 XML文件理解 常用的XML类方法使用 总结 前言 TinyXML下载地址:https://sourceforge.net/projects/tinyxml/ 官方文档:TinyXML TinyXML是个解析库,它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h.tinystr.h.tinystr.cpp.tinyxml.cpp.tinyxmlerror.cpp.tinyxmlparser.cpp)导入工程就可以用它的东西了.如果需要

  • java实现简单解析XML文件功能示例

    本文实例讲述了java实现简单解析XML文件功能.分享给大家供大家参考,具体如下: package demo; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;

  • python解析xml文件操作实例

    本文实例讲述了python解析xml文件操作的实现方法.分享给大家供大家参考.具体方法如下: xml文件内容如下: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first

  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    本文实例讲述了Android编程解析XML文件的方法.分享给大家供大家参考,具体如下: 前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,

  • 详解Android之解析XML文件三种方式(DOM,PULL,SAX)

    1.xml文件代码 <?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core

随机推荐