TinyXML用法小结

1.      介绍

Tinyxml的官方网址:http://www.grinninglizard.com

官方介绍文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html

在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 version="1.0" ?> //TiXmlDeclaration,声明
<MyApp>    //TiXmlElement,元素<!-- Settings for MyApp -->//TiXmlComment,注释<Messages>//TiXmlElement,元素<Welcome>Welcome to MyApp</Welcome>
//<Welcome>是元素TiXmlElement ,“Welcome to MyApp”是TiXmlText,文本<Farewell>Thank you for using MyApp</Farewell>//同上</Messages><Windows>//TiXmlElement,元素<Window name="MainFrame" x="5" y="15" w="400" h="250" />
// Window是元素TiXmlElement ,name、x、y、h是TiXmlAttribute</Windows><Connection ip="192.168.0.1" timeout="123.456000" />
</MyApp

 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来调用。

注意,TiXmlBase 是TiXmlNode的基类,TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、TiXmlDocument的基类。

2.      TinyXML配置

在stdafx.h头文件中增加头文件引用#include "tinyxml/tinyxml.h"

在工程设置中加入lib引用库

在stdafx.h中加入动态库引用

#ifdef _DEBUG
#pragma comment(lib,"TinyXMLD.lib")
#else
#pragma comment(lib,"TinyXML.lib")
#endif

3.      TinyXML读取和保存文件

3.1 读取xml文件

TiXmlDocument lconfigXML;
if( !lconfigXML.LoadFile( strXmlFile.c_str() ) )
{break;
}

3.2 读取xml参数

TiXmlDocument lActionXML;
lActionXML.Parse(strRmcpParam.c_str());
if(lActionXML.Error())
{strErr = "输入参数不是标准的xml格式";return false;}

3.3 保存xml参数到文本

TiXmlDocument tyDoc;
…
tyDoc.SaveFile(m_strFilePath);

3.4 保存xml参数到临时变量

TiXmlDocument tyDoc;
…
TiXmlPrinter printer;
tyDoc.Accept(&printer);
std::string devParam = std::string(printer.CStr());

4.      TinyXML增删改查

4.1 增

创建一个如1中的xml文件代码

void write_app_settings_doc( )
{  TiXmlDocument doc;  TiXmlElement* msg;TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );  doc.LinkEndChild( decl );   TiXmlElement * root = new TiXmlElement( "MyApp" );  doc.LinkEndChild( root );  TiXmlComment * comment = new TiXmlComment();comment->SetValue(" Settings for MyApp " );  root->LinkEndChild( comment );   TiXmlElement * msgs = new TiXmlElement( "Messages" );  root->LinkEndChild( msgs );   msg = new TiXmlElement( "Welcome" );  msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));  msgs->LinkEndChild( msg );   msg = new TiXmlElement( "Farewell" );  msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));  msgs->LinkEndChild( msg );   TiXmlElement * windows = new TiXmlElement( "Windows" );  root->LinkEndChild( windows );  TiXmlElement * window;window = new TiXmlElement( "Window" );  windows->LinkEndChild( window );  window->SetAttribute("name", "MainFrame");window->SetAttribute("x", 5);window->SetAttribute("y", 15);window->SetAttribute("w", 400);window->SetAttribute("h", 250);TiXmlElement * cxn = new TiXmlElement( "Connection" );  root->LinkEndChild( cxn );  cxn->SetAttribute("ip", "192.168.0.1");cxn->SetDoubleAttribute("timeout", 123.456); // floating point attribdump_to_stdout( &doc );doc.SaveFile( "appsettings.xml" );
} 

在节点最后插入新节点

TiXmlNode* LinkEndChild( TiXmlNode* addThis );

在节点后 前/后 插入新节点

TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );

4.2 删

删除某个节点, 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 );

4.3 改

查找内容为<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 ); 

4.4 查

获取link节点

const TiXmlNode* lpItemNode = NULL;//初始化
lpItemNode = lconfigXML.RootElement()->IterateChildren("link", lpItemNode);
if (lpItemNode == NULL)
{//Can not find <link>break;
}

获取link节点中的type属性值

std::string strType = lpItemNode->ToElement()->Attribute("type");

遍历节点

const TiXmlNode* lpMapNode = NULL; //初始化
lpMapNode = lconfigXML.RootElement()->IterateChildren("node", lpMapNode);
if (lpMapNode)
{rms::CStationMapping litem;const TiXmlNode* lpItemNode = NULL ;while(lpItemNode = lpMapNode->IterateChildren("item",lpItemNode)){string str = lpItemNode->ToElement()->Attribute("ABC"); }
}

遍历元素属性

TiXmlAttribute* pAttr = NULL;
for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next())
{    …
}

节点的下一个兄弟节点

const TiXmlNode* NextSibling() const;

元素的下一个元素

const TiXmlElement* NextSiblingElement() const;

属性的下一个属性

const TiXmlAttribute* Next() const;

返回值为NULL表示不存在

5.      一个完整例子

void AppSettings::load(const char* pFilename)
{
    TiXmlDocument doc(pFilename);
    if (!doc.LoadFile()) return;

TiXmlHandle hDoc(&doc);
    TiXmlElement* pElem;
    TiXmlHandle hRoot(0);

// block: name
    {
        pElem=hDoc.FirstChildElement().Element();
        // should always have a valid root but handle gracefully if it does
        if (!pElem) return;
        m_name=pElem->Value();

// save this for later
        hRoot=TiXmlHandle(pElem);
    }

// block: string table
    {
        m_messages.clear(); // trash existing table

pElem=hRoot.FirstChild( "Messages" ).FirstChild().Element();
        for( pElem; pElem; pElem=pElem->NextSiblingElement())
        {
            const char *pKey=pElem->Value();
            const char *pText=pElem->GetText();
            if (pKey && pText) 
            {
                m_messages[pKey]=pText;
            }
        }
    }

// block: windows
    {
        m_windows.clear(); // trash existing list

TiXmlElement* pWindowNode=hRoot.FirstChild( "Windows" ).FirstChild().Element();
        for( pWindowNode; pWindowNode; pWindowNode=pWindowNode->NextSiblingElement())
        {
            WindowSettings w;
            const char *pName=pWindowNode->Attribute("name");
            if (pName) w.name=pName;
            
            pWindowNode->QueryIntAttribute("x", &w.x); // If this fails, original value is left as-is
            pWindowNode->QueryIntAttribute("y", &w.y);
            pWindowNode->QueryIntAttribute("w", &w.w);
            pWindowNode->QueryIntAttribute("hh", &w.h);

m_windows.push_back(w);
        }
    }

// block: connection
    {
        pElem=hRoot.FirstChild("Connection").Element();
        if (pElem)
        {
            m_connection.ip=pElem->Attribute("ip");
            pElem->QueryDoubleAttribute("timeout",&m_connection.timeout);
        }
    }
}

TinyXML用法小结相关推荐

  1. oracle @spool,Oracle spool 用法小结

    Oracle spool 用法小结 转自:http://wallimn.javaeye.com/blog/472182 对于SPOOL 数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句 ...

  2. js push(),pop(),unshift(),shift()的用法小结

    js中push(),pop(),unshift(),shift()的用法小结 1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及内容 ...

  3. C++ :: 的用法小结

    原文:http://blog.csdn.net/whz_zb/article/details/6843369 :: 的用法小结: 用于将类内声明的静态数据成员在类外初始化: 用于将类内声明的函数成员在 ...

  4. Java中getResourceAsStream的用法小结

    2019独角兽企业重金招聘Python工程师标准>>> Java中getResourceAsStream的用法小结 一.Java中的getResourceAsStream主要有以下三 ...

  5. setscale方法的用法_基于BigDecimal.setScale的用法小结

    1. BigDecimal num1 = new BigDecimal(2.225667);//这种写法不允许,会造成精度损失 2. BigDecimal num2 = new BigDecimal( ...

  6. java.nio.ByteBuffer用法小结

    转载自  java.nio.ByteBuffer用法小结 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入 ...

  7. jsoup解析HTML用法小结

    转载自   jsoup解析HTML用法小结 使用HttpClient+jsoup做采集器有一段时间了,发现jsoup很好用,而且还有很多方便的东西都没怎么用上.于是想根据官网上的cookbook来对j ...

  8. [转]ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

  9. Linux: chmod 和 chown用法小结

    chmod chmod指令是更改文件读写执行权限的. 文件权限可以通过ls -a或ll来看,在每个文件前有10个字符,第一个是d是文件夹,否则为一划.后面三组rwx,分别是读取,写入和执行的权限; 三 ...

最新文章

  1. 深入浅出Spring Security(三):FilterChainProxy的运行过程
  2. 实验一HSRP与STP结合
  3. Servlet实现的个人所得税计算器
  4. 【项目管理】ITTO-资源管理
  5. 又见斐波那契~矩阵快速幂入门题
  6. C++ STL的查找算法
  7. 盘点一下数据库的误操作都有哪些后悔药?
  8. 部分高级正则特性 使用
  9. Python股票历史数据下载
  10. vscode解决方案 关闭源代码管理
  11. 《OpenDRIVE1.6规格文档》1
  12. opencv cv2 python RGB BGR 颜色表 配色
  13. 自然语言处理之维特比(Viterbi)算法
  14. gitlab:切换远程仓库
  15. c/c++ substr()函数
  16. 360度全景虚拟漫游导览在地产景区的应用优势
  17. 多卡聚合路由器和企业路由器的区别
  18. 为MCU在Qt上运行Doom
  19. 7-18 银行业务队列简单模拟
  20. 阿里云服务器如何修改远程端口?

热门文章

  1. python简介小报_前端小报 - 201903月刊
  2. squeeze()----MATLAB
  3. 空间数据库基础理论 GIS空间数据处理分析涉及的基本概念
  4. 幼儿园案例经验迁移_幼儿园案例分析《三个强盗》5篇
  5. 【java】对jdbc操作结果简单的映射封装
  6. Round3:我的黑白框雷霆战机进阶2
  7. 全球及中国甲基正丙基酮行业行业专项调查与投资战略研究报告2022-2028年
  8. hpuoj 1691 追女孩
  9. Cakewalk Z3TA Plus 2 Presets/Banks Bundle 合成器预设合集
  10. Swift中的宏定义