跳转到主内容
极星编程网:以代码为星,赴技术山海!

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 查

5.一个完整例子

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

根据下图来说明常用的类对应的文本格式: //TiXmlDeclaration,声明 //TiXmlElement,元素//TiXmlComment,注释//TiXmlElement,元素Welcome to MyApp//是元素TiXmlElement ,“Welcome to MyApp”是TiXmlText,文本Thank you for using MyApp//同上//TiXmlElement,元素// Window是元素TiXmlElement ,name、x、y、h是TiXmlAttributeTinyXML是个解析库,主要由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 attrib dump_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节点上移除子节点BTiXmlNode nodeA;nodeA. RemoveChild( TiXmlNode* removeThis );从元素A上移除名字为B的属性TiXmlAttribute attrA;attrA. RemoveAttribute( const char * name );4.3 改查找内容为,现需要将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 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);}}}到此这篇关于C++使用TinyXML解析XML的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:C++ TinyXML解析案例详解c++中用TINYXML解析XML文件tinyxml 常用的C++ XML解析器非常优秀C++中TinyXML读取xml文件用法详解

相关文章