您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++怎么使用TinyXML解析XML”,在日常操作中,相信很多人在C++怎么使用TinyXML解析XML問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++怎么使用TinyXML解析XML”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
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的基類。
在stdafx.h頭文件中增加頭文件引用#include "tinyxml/tinyxml.h"
在工程設置中加入lib引用庫
在stdafx.h中加入動態庫引用
#ifdef _DEBUG #pragma comment(lib,"TinyXMLD.lib") #else #pragma comment(lib,"TinyXML.lib") #endif
TiXmlDocument lconfigXML; if( !lconfigXML.LoadFile( strXmlFile.c_str() ) ) { break; }
TiXmlDocument lActionXML; lActionXML.Parse(strRmcpParam.c_str()); if(lActionXML.Error()) { strErr = "輸入參數不是標準的xml格式"; return false; }
TiXmlDocument tyDoc; … tyDoc.SaveFile(m_strFilePath);
TiXmlDocument tyDoc; … TiXmlPrinter printer; tyDoc.Accept(&printer); std::string devParam = std::string(printer.CStr());
創建一個如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 );
刪除某個節點, 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 );
查找內容為<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 );
獲取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”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。