温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++怎么使用TinyXML解析XML

发布时间:2021-12-20 10:26:35 来源:亿速云 阅读:149 作者:iii 栏目:开发技术

这篇文章主要介绍“C++怎么使用TinyXML解析XML”,在日常操作中,相信很多人在C++怎么使用TinyXML解析XML问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么使用TinyXML解析XML”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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 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节点上移除子节点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);         }     } }

到此,关于“C++怎么使用TinyXML解析XML”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI