c++ xml操作,TinyXML2簡單入門
阿新 • • 發佈:2018-12-20
前言
TinyXml2是一個輕量級基於c++的開源xml解析庫。使用非常簡單方便
下載
https://github.com/leethomason/tinyxml2
使用方法
將tinyxml2.cpp和tinyxml2.h拷貝至專案目錄,使用時包含
#include "tinyxml2.h"
using namespace tinyxml2
生成的xml內容參考
<?xml version="1.0" encoding="UTF-8"?> <Root> <Node1 att1="text" att2="123" att3="-123" att4="true">node text</Node1> <Node2>12345</Node2> <Node3>false</Node3> <Node4> <List1>List1</List1> <List2>-123</List2> </Node4> <Node5> <List>0</List> <List>1</List> <List>2</List> <List>3</List> <List>4</List> <List2>0</List2> <List2>1</List2> <List2>2</List2> <List2>3</List2> <List2>4</List2> </Node5> </Root>
程式碼示例
#include <stdio.h> #include "tinyxml2\tinyxml2.h" using namespace tinyxml2; /* 寫xml */ XMLError writeXML(const char* xmlPath) { XMLDocument doc; // 建立xml文件 /* 新增申明,就是xml檔案最上邊的“<?xml version="1.0" encoding="UTF-8"?>” */ doc.InsertFirstChild(doc.NewDeclaration()); /* 還可以這樣新增自定義宣告 */ //doc.InsertFirstChild(doc.NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"")); /* 新增跟元素 */ XMLElement* root = doc.NewElement("Root"); // 建立跟元素 doc.InsertEndChild(root); // 將跟節點加入文件 /* 新增子元素1 */ XMLElement* node = doc.NewElement("Node1"); // 建立子元素1 root->InsertEndChild(node); // 將子元素1加入跟元素 node->SetAttribute( "att1", "text" ); // 新增文字屬性 node->SetAttribute( "att2", 123 ); // 新增數字屬性 node->SetAttribute( "att3", -123 ); // 新增數字屬性 node->SetAttribute( "att4", true ); // 添加布爾屬性 node->SetText( "node text" ); // 新增元素內容 /* 新增子元素2 */ node = doc.NewElement("Node2"); // 建立子元素2 root->InsertEndChild(node); // 將子元素2加入跟元素 node->SetText( 12345 ); // 新增元素內容 數字 /* 新增子元素3 */ node = doc.NewElement("Node3"); // 建立子元素3 root->InsertEndChild(node); // 將子元素3加入跟元素 node->SetText( false ); // 新增元素內容 布林 /* 新增子元素4 */ node = doc.NewElement("Node4"); // 建立子元素4 root->InsertEndChild(node); // 將子元素4加入跟元素 /* 子元素4新增從元素 */ XMLElement* list = doc.NewElement("List1"); // 建立從元素41 node->InsertEndChild(list); // 將從元素41加入子元素4 list->SetText( "List1" ); // 新增元素內容 /* 子元素4新增從元素 */ list = doc.NewElement("List2"); // 建立從元素42 node->InsertEndChild(list); // 將從元素42加入子元素4 list->SetText( -123 ); // 新增元素內容 有符號數 /* 新增子元素5 */ node = doc.NewElement("Node5"); // 建立子元素5 root->InsertEndChild(node); // 將子元素5加入跟元素 /* 子元素5新增從元素 */ for(int i=0; i< 5; i++) { list = doc.NewElement("List"); node->InsertEndChild(list); list->SetText( i ); } /* 子元素5新增從元素 */ for(int i=0; i< 5; i++) { list = doc.NewElement("List2"); node->InsertEndChild(list); list->SetText( i ); } /* 寫入檔案 */ return doc.SaveFile(xmlPath); } /* 讀xml */ XMLError readXML(const char* xmlPath) { XMLDocument doc; XMLError error; /* 開啟文件 */ error = doc.LoadFile(xmlPath); if(error != XML_SUCCESS) return error; /* 獲取跟元素 */ XMLElement* root = doc.RootElement(); printf("Root - Name: %s \r\n\r\n", root->Name()); // 跟元素名 /* 獲取子元素1 */ XMLElement* node = root->FirstChildElement( "Node1"); if(node) { printf("Node - Name: %s \r\n", node->Name()); // 元素名 printf("Node - att1: %s \r\n", node->Attribute( "att1" )); // 文字屬性 printf("Node - att2: %d \r\n", node->UnsignedAttribute( "att2" )); // 數字屬性 無符號數 printf("Node - att3: %d \r\n", node->IntAttribute( "att3" )); // 數字屬性 有符號數 printf("Node - att4: %s \r\n", node->BoolAttribute( "att4" ) ? "真" : "假"); // 布林屬性 printf("Node - Text: %s \r\n", node->GetText()); // 元素內容 printf("\r\n"); } /* 獲取子元素2 */ node = root->FirstChildElement( "Node2"); if(node) { printf("Node - Name: %s \r\n", node->Name()); // 元素名 printf("Node - Text: %d \r\n", node->UnsignedText()); // 元素內容 printf("\r\n"); } /* 獲取子元素3 */ node = root->FirstChildElement( "Node3"); if(node) { printf("Node - Name: %s \r\n", node->Name()); // 元素名 printf("Node - Text: %s \r\n", node->BoolText() ? "真" : "假"); // 元素內容 printf("\r\n"); } /* 獲取子元素4 */ node = root->FirstChildElement( "Node4"); if(node) { printf("Node - Name: %s \r\n", node->Name()); // 元素名 /* 從元素 */ XMLElement* list = node->FirstChildElement( "List1"); if(list) { printf("List - Name: %s \r\n", list->Name()); printf("List - Text: %s \r\n", list->GetText()); } /* 從元素 */ list = node->FirstChildElement( "List2"); if(list) { printf("List - Name: %s \r\n", list->Name()); printf("List - Text: %d \r\n", list->IntText()); } printf("\r\n"); } /* 獲取子元素5 */ node = root->FirstChildElement( "Node5"); if(node) { printf("Node - Name: %s \r\n", node->Name()); #if 1 /* 從元素List */ XMLElement* list = node->FirstChildElement( "List"); while (list) { printf("List - Name: %s \t Text: %d \r\n", list->Name(),list->IntText()); list = list->NextSiblingElement("List"); } /* 從元素List1 */ list = node->FirstChildElement( "List2"); while (list) { printf("List - Name: %s \t Text: %d \r\n", list->Name(),list->IntText()); list = list->NextSiblingElement("List2"); } #else /* 獲取所有從元素 */ XMLElement* list = node->FirstChildElement(); while (list) { printf("List - Name: %s \t Text: %d \r\n", list->Name(),list->IntText()); list = list->NextSiblingElement(); } #endif printf("\r\n"); } return error; } int main(void) { printf("按任意鍵開始寫xml \r\n"); getchar(); XMLError error = writeXML("text.xml"); printf("寫入結果:%s %s \r\n\r\n", XMLDocument::ErrorIDToName(error), (error == XML_SUCCESS) ? "(已寫入text.xml)" : "(寫入失敗)"); printf("任意鍵開始讀 text.xml"); getchar(); readXML("text.xml"); printf("任意鍵退出……"); getchar(); return 0; }