• TinyXML 使用说明


      TinyXML是一个C++的XML解析库,网上的评价都不错,是一个轻量级的XML解析库。关于TinyXML使用的文章有很多,而且官方也有完整的文档,这里只是简单把自己使用记录写下来,方便以后查阅。

      

        一个XML文档例子:(文章后面会把这个XML当作例子使用)

     

     <!-- test.xml -->

    <Persons>
    <Person ID="1">
    周星星
    </Person>
    <Person ID="2">
    白晶晶
    </Person>
    </Persons>



     

    TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。

     

        使用的时候,只要把tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp 这六个文件导入工程,然后#include ” tinyxml.h”就可以使用。

     

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

     

    这些类都是对应XML文件的一些元素,所以最好对XML文件有一些必要的了解。

     

    TinyXML库对字符串可以使用两种编译方式:char * 以及 string 。所以我们在Wince使用的时候需要注意宽字符的转换。

     

    1、将一个文件加载到 TinyXML DOM 中的最简单方法:

     

    1 TiXmlDocument doc( "demo.xml" );
    2
    3 //注意TiXmlDocument构造方法参数类型是string
    4 doc.LoadFile();



    2、创建XML文件

     

     1 TiXmlDocument doc;
    2
    3 //xml文件声明部分
    4 TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );

    5
    6 //添加新的节点元素
    7 TiXmlElement * element = new TiXmlElement( "Hello" );

    8
    9 //对应Hello节点的值
    10 TiXmlText * text = new TiXmlText( "World" );

    11
    12 //Hello 节点是文本节点,没有子节点
    13 element->LinkEndChild( text );

    14
    15 //把声明和元素添加到文档
    16 doc.LinkEndChild( decl );

    17 doc.LinkEndChild( element );
    18
    19 //保存文档,修改过的xml文件一定要调用SaveFile方法保存数据
    20 doc.SaveFile( "madeByHand.xml" );



    3、遍历整个XML文档

    XML文档遍历,主要就是把DOM里面的元素、节点、节点属性全部遍历一次。

     

    //首先需要找到根节点,

    TiXmlElement * rootElement = doc.RootElement();

    //根节点的第一个子节点(根节点、子节点的概念,请看参考资料)

    TiXmlElement * firstElement = rootElement->FirstChildElement();

     

     

    然后可以用上面的方法循环查询同一个节点下的子节点,再加上一个递归循环就可以查询所有的节点。具体代码看参考工程里面的例子。具体代码已经封装成函数。TinyXMLCtl.h头文件

     

     

    我们在Wince里面大部分时候可能都是使用查询XML里面的数据,下面针对给出一个简单的查询功能,然后界面一些TinyXML里面的常用方法。

     

    这是一个简单的遍历查询XML文档的代码,功能是遍历XML文档下根节点下的所有兄弟节点。(如果需要遍历兄弟节点下的子节点,需要加个递归调用就好)

     

     

    //查找根节点,rootElement就是指向<Persons>元素(看文档刚开始时给出的XML文件)

    TiXmlElement * rootElement = doc.RootElement();

    //查找根节点下第一个子节点,firstElement 指向第一个<Person>节点

    TiXmlElement * firstElement = rootElement->FirstChildElement();



    TiXmlElement *nextElement = firstElement;

    //我在使用的时候使用了TinyXML的char * 字符编译,所以使用的方法返回的字//符串都是 char * 类型的。

    const char *value;

    const char *name;



    //保存遍历得到的数据

    CString temp;



    //循环遍历根节点下的兄弟节点

    while(nextElement)

    {

    //取出节点的文本节点内容,第一个Person节点的值是周星星

    value = nextElement->GetText();

    //取出节点的节点名字,第一个节点是Person

    name = nextElement->Value();

    //TinyXML里面返回的是char *类型的数据,这里要把它转为宽字符,最简单的方法是//直接转为CString,当然也可以用//MultiByteToWideChar,WideCharToMultiByte这两个微软提供的宽字符转换的//函数进行转换,在TinyXMLCtl.h里面,给出了两个封装的函数,具体请自行查看。

    CString mmValue(value);

    CString mmName(name);

    temp = temp + mmValue + L""+ mmName+L"";

    //查找下一个兄弟节点的指针

    nextElement = nextElement->NextSiblingElement();

    }



    上面最后temp字符串里面应该存放的是:Person 周星星 Person 白晶晶 。

     

    上面只是一个简单遍历同级兄弟节点的方法,只要掌握这几个常用方法就可以自己拓展出复杂的查询方法。

     

    下面再给出对数据常用的操作方法:增删改查 的简单例子和解析

     

    4、修改XML节点

     

    //下面例子是修改test.xml第一个person节点的值“周星星”改为“星星”

    //加载文档到DOM,跟上面一样

    TiXmlDocument doc("test.xml");

    doc.LoadFile();

    //获取一个DOM的句柄,操作XML可以用节点Node、元素Element、或者句柄Handle都可//以。三种操作可以根据实际进行转换,转换方法可以参考官方文档。

    TiXmlHandle docHandle( &doc );

    //找到要修改的那个节点指针,这里是具体知道节点结构才这么做。实际使用的时候,我们需//要遍历查找一个节点名。在TinyXMLCtl.h头文件给出了实现的方法。下面这句话功能跟//doc.RootElement()效果一样,都是为了找到根节点。

    TiXmlElement* DesElement = docHandle.FirstChild("Persons "). ToElement();

    //找到该节点的第一个子节点(我们要修改的节点)

    TiXmlNode * oldnode = DesElement->FirstChild();

    //这里先获取该节点的

    const char *ver = DesElement ->GetText();

    //新的值,注意字符编码转换问题

    string strText=”星星”;

    TiXmlText *pValue = new TiXmlText(strText.c_str());

    // 首先清除所有文本

    pNode->Clear();

    //把新文本添加进去,这里只是其中一种修改方法,还可以调用ReplaceChild()方法修改。

    pNode->LinkEndChild(pValue);

    //一定要保存文件,否则修改无效

    doc.SaveFile();

     


     

     

    5、删除XML节点

    节点删除,注意使用两个方法:

    RemoveChild( TiXmlNode* removeThis )//方法删除父节点的子节点
    RemoveAttribute( const char * name )//方法删除属性值.

     

     1 //删除第一个节点Person
    2

    3 TiXmlDocument doc( "\\Storage Card\\test.xml" );
    4
    5 doc.LoadFile();
    6
    7 TiXmlElement * rootElement = doc.RootElement();
    8
    9 TiXmlElement * firstElement = rootElement->FirstChildElement();
    10
    11 //删除根节点下的第一个节点
    12

    13 RemoveChild(firstElement);
    14
    15 doc.SaveFile();

     


     

    5、新增XML节点

    //加载文档

     

     1 TiXmlDocument *pDoc = new TiXmlDocument();
    2
    3 pDoc->LoadFile(pXMLFile);
    4
    5 TiXmlElement * rootElement = doc.RootElement();
    6
    7 TiXmlElement * firstElement = rootElement->FirstChildElement();
    8
    9
    10 string strText=“hello”;
    11
    12 // 生成子节点:pNewNode
    13

    14 TiXmlElement *pNewNode = new TiXmlElement(strNodeName.c_str());
    15
    16 // 设置节点文本,然后插入节点
    17

    18 TiXmlText *pNewValue = new TiXmlText(strText.c_str());
    19
    20 pNewNode->LinkEndChild(pNewValue);
    21
    22 //插入节点
    23

    24 pNode->InsertEndChild(*pNewNode);
    25
    26 pDoc->SaveFile(pXMLFile);



  • 相关阅读:
    宽屏手机显示9.png的图片拉伸不均衡
    android中 System.exit(0)的理解
    android 由于界面控件过多耗时处理办法
    iOS开发笔记--sqlite3 语句总结
    iOS开发笔记--iOS应用架构谈
    iOS开发笔记--iOS 学习资料整理
    iOS开发笔记--iOS、mac开源项目及库汇总
    iOS开发笔记--iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognize
    iOS开发笔记--Masonry介绍与使用实践:快速上手Autolayout
    iOS开发笔记--使用CocoaPods来管理iOS项目的依赖库
  • 原文地址:https://www.cnblogs.com/mythou/p/2265169.html
Copyright © 2020-2023  润新知