日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

tinyxml在linux和windows下的编译及使用详解

發布時間:2024/2/28 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tinyxml在linux和windows下的编译及使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:摘要
1.XML全稱EXtensible Markup Language,翻譯為可擴展標記語言,XML文件通常就是一個文本文件,可以使用任何編碼
2.TinyXML是一個開源的C++用來處理XML的第三方庫?

二:說明
1.本篇博客下載的是tinyxml_2_6_2版本,tinyxml_2_6_2下載地址:http://download.csdn.net/download/yzf279533105/9924003

2.?博客內容及所有代碼均是在該版本下編譯,運行,測試通過的,示例代碼下載地址

?

? ? ? ? windows下示例代碼:http://download.csdn.net/download/yzf279533105/9942336

? ? ? ? Linux下示例代碼:(內有介紹文檔,請按照文檔步驟操作,保證可以運行成功)

? ? ? ? ? ? 使用靜態庫的示例代碼:http://download.csdn.net/download/yzf279533105/9942600

? ? ? ? ? ? 使用動態庫的示例代碼:http://download.csdn.net/download/yzf279533105/9942605

三.Windows下的編譯
? ? 1.從上面的地址下載得到tinyxml_2_6_2.zip文件,解壓得到tinyxml_2_6_2文件夾
? ? 2.進入目錄tinyxml_2_6_2/tinyxml,可以看到源代碼一共2個頭文件,4個源文件,分別是tinyxml.h,tinystr.h,tinyxml.cpp,tinystr.cpp,tinyxmlerror.cpp,tinyxmlparse.cpp
? ? 3.由于tinyxml庫很小,沒必要編譯成靜態庫或者動態庫,把上面列舉的6個文件拷貝到示例工程目錄下即可直接使用

四.Windows下的使用

?

?

? ? 1.建立一個空的win32控制臺工程,類似HellowWorld的工程即可,我這里工程命名為tinyxmlExample
? ? 2.在本示例工程根目錄添加tinyxml文件夾,把上述列舉的6個tinyxml文件拷貝到該目錄下,在屬性頁 配置屬性 -> C/C++ -> 常規 -> 附加包含目錄 中設置該工程的頭文件目錄,即“../”,表示附加了根目錄
? ? 3. 在工程中添加源文件,把整個tinyxml包含進來,這樣所有的代碼就包含進來了

? ? 4. 添加一個源文件main.cpp,代碼如下:

#include <iostream> #include "tinyxml/tinyxml.h" using namespace std;int main() {// 新建的xml文件名字string filename = "example.xml";新建一個xml文件 // 定義一個TiXmlDocument類指針TiXmlDocument* pWriteDoc = new TiXmlDocument();// xml的聲明(三個屬性:版本,編碼格式,獨立文件聲明)TiXmlDeclaration* pDeclare = new TiXmlDeclaration("1.0", "UTF-8", "yes"); pWriteDoc->LinkEndChild(pDeclare); // 連接到最后// 根節點TiXmlElement* pRootElement = new TiXmlElement("telephonebook");pWriteDoc->LinkEndChild(pRootElement); // 把根節點連接到最后// 二級節點TiXmlElement* pPersonElement = new TiXmlElement("person"); //通訊錄節點pRootElement->LinkEndChild(pPersonElement); // 連接到根節點下// 三級節點TiXmlElement* pNameElement = new TiXmlElement("name");// 文本TiXmlText* nameContent = new TiXmlText("xiaoming"); // 通訊錄名字pNameElement->LinkEndChild(nameContent); // 給三級節點添加文本pPersonElement->LinkEndChild(pNameElement); // 把三級節點連接到二級節點下// 三級節點TiXmlElement* pAddrElement = new TiXmlElement("addr"); // 通訊錄地址// 設置屬性pAddrElement->SetAttribute("addr1","hubei");pAddrElement->SetAttribute("addr2","wuhan");pPersonElement->LinkEndChild(pAddrElement); // 把三級節點連接到二級節點下// 三級節點TiXmlElement* pEmailElement = new TiXmlElement("email");// 通訊錄郵件// 文本TiXmlText* emailContent = new TiXmlText("1234567@qq.com"); pEmailElement->LinkEndChild(emailContent); // 給三級節點添加文本pPersonElement->LinkEndChild(pEmailElement);// 把三級節點連接到二級節點下/// 保存到文件 pWriteDoc->SaveFile(filename.c_str());printf( "new xml success, file's name is %s\n\n", filename.c_str()); 從文件中讀取 // 定義一個TiXmlDocument類指針TiXmlDocument* pReadDocument = new TiXmlDocument();// 讀取文件if (!pReadDocument->LoadFile(filename.c_str())){printf( "Could not load example xml file %s. Error='%s'\n", filename.c_str(),pReadDocument->ErrorDesc() ); return 0;}printf("read xml file success, file' name is %s \n\n",filename.c_str());//讀取文檔聲明信息(第一個子節點轉換得到文檔聲明)TiXmlDeclaration* pDeclar = pReadDocument->FirstChild()->ToDeclaration();if (pDeclar != NULL){printf("read declare, version is %s , encoding is %s\n",pDeclar->Version(), pDeclar->Encoding());}// 得到文件根節點pRootElement = pReadDocument->RootElement();遍歷元素,打印 printf("begin read all xml element \n\n");// 遍歷所有的person// 函數FirstChildElement() : 找到指定名字的元素// 函數NextSiblingElement : 在同一級元素中查找下一個指定名字的元素int i = 0;for (TiXmlElement* pItem = pRootElement->FirstChildElement("person"); pItem; pItem = pItem->NextSiblingElement("person")){printf("read the %d person \n",++i);// 名字TiXmlElement* pName = pItem->FirstChildElement("name");if (pName != NULL){printf("the %d person's name = %s \n", i, pName->GetText());}// 地址TiXmlElement* pAddr = pItem->FirstChildElement("addr");if (pAddr != NULL){// 第一個屬性TiXmlAttribute* pAddr1 = pAddr->FirstAttribute();if (pAddr1 != NULL){printf("the %d person's addr1 = %s \n", i, pAddr1->Value());// 下一個屬性TiXmlAttribute* pAddr2 = pAddr1->Next();if (pAddr2 != NULL){printf("the %d person's addr2 = %s \n", i, pAddr2->Value());}} }printf("\n\n");}刪除元素,屬性 TiXmlElement* pPerson = pRootElement->FirstChildElement("person");if (pPerson != NULL){// 這里演示刪除"email"元素,刪除其他節點也是一樣的辦法TiXmlElement* pEmail = pPerson->FirstChildElement("email");if (pEmail != NULL){pPerson->RemoveChild(pEmail);}// 這里演示修改"addr"元素TiXmlElement* pAddr = pPerson->FirstChildElement("addr");if (pAddr != NULL){pAddr->SetAttribute("addr2", "huanggang"); // 修改屬性值// 刪除屬性//pAddr->RemoveAttribute("addr1");} }// 增加元素 // 新建一個元素,名字:personTiXmlElement* pNewElement = new TiXmlElement("person");// 給新建的元素創建子元素并連接到最后TiXmlElement* pNameElementAdd = new TiXmlElement("name"); // 元素:nameTiXmlText* pNameText = new TiXmlText("zhangsan");pNameElementAdd->LinkEndChild(pNameText); // 該元素下添加文本內容TiXmlElement* pAddrElementAdd = new TiXmlElement("addr"); // 元素:addrpAddrElementAdd->SetAttribute("addr1","guangdong");pAddrElementAdd->SetAttribute("addr2","shenzhen"); // 該元素下添加屬性TiXmlElement* pEmailElementAdd = new TiXmlElement("email"); // 元素:emailTiXmlText* pEmailText = new TiXmlText("zhangsan@qq.com");pEmailElementAdd->LinkEndChild(pEmailText); // 該元素下添加文本內容// 都掛接到新建元素下pNewElement->LinkEndChild(pNameElementAdd); pNewElement->LinkEndChild(pAddrElementAdd);pNewElement->LinkEndChild(pEmailElementAdd);// 把這個新建元素掛在根節點最后pRootElement->LinkEndChild(pNewElement);printf("add new element success\n");/// 再次保存到文件 if (pReadDocument->SaveFile(filename.c_str())){printf("save file success\n");}getchar();return 0; }


五.Linux下的編譯

? ? 1.?從上面的地址下載得到tinyxml_2_6_2.zip文件,執行解壓命令 unzip tinyxml_2_6_2.zip 得到文件夾tinyxml

?

? ? 2. 編譯成靜態庫

? ? ? ? 2.1 進入目錄tinyxml,用vim命令打開Makefile文件

? ? ? ? 2.2 將其中一行 OUTPUT := xmltest 修改為 OUTPUT := libtinyxml.a ?表示編譯出的靜態庫文件名字為 libtinyxml.a

? ? ? ? 2.3 將其中一行?SRCS :=tinyxml.cpp tinyxml-parser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp 中的xmltest.cpp刪掉 因為不需要編譯該測試文件

? ? ? ? 2.4 將其中一行?${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 修改為?${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 表示鏈接成靜態庫

? ? ? ? 2.5 將其中一行?xmltest.o:tinyxml.h tinystr.h 刪除,因為不需要編譯測試文件

? ? ? ? 2.6 保存Makefile文件

? ? ? ? 2.7 回退到上一層目錄即目錄tinyxml中,執行make命令,即可在該目錄得到編譯出來的靜態庫文件libtinyxml.a

? ? 3. 編譯成動態庫

? ? ? ? 3.1 進入目錄tinyxml,用vim命令打開Makefile文件

? ? ? ? 3.2 在其中一行?DEBUG_CFLAGS ? ? := -Wall -Wno-format -g -DDEBUG -fPIC 的末尾添加上 -fPIC 表示編譯與位置無關的代碼,PIC的意思即 Position Independent Code,

? ? ? ? 3.3 在其中一行?RELEASE_CFLAGS ? := -Wall -Wno-unknown-pragmas -Wno-format -O3 的末尾添加上 -fPIC 原因同上

? ? ? ? 3.4?將其中一行 OUTPUT := xmltest 修改為 OUTPUT := libtinyxml.so ?表示編譯出的動態庫文件名字為 libtinyxml.so

? ? ? ? 3.5?將其中一行?SRCS :=tinyxml.cpp tinyxml-parser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp 中的xmltest.cpp刪掉 因為不需要編譯該測試文件

? ? ? ? 3.6?將其中一行?${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 修改為?${LD} -shared -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS} 表示鏈接成動態庫

? ? ? ? 3.7?將其中一行?xmltest.o:tinyxml.h tinystr.h 刪除,因為不需要編譯測試文件

? ? ? ? 3.8?保存Makefile文件

? ? ? ? 3.9?回退到上一層目錄即目錄tinyxml中,執行make命令,即可在該目錄得到編譯出來的動態庫文件libtinyxml.so

六.Linux下的使用

? ? 1. ? 代碼與步驟四中windows下的代碼完全相同,需編寫makefile,示例代碼中有

? ? 2. ??linux下示例代碼下載地址:(內有介紹文檔,請按照文檔步驟操作,保證可以運行成功)

? ? ? ? 使用靜態庫的示例代碼:http://download.csdn.net/download/yzf279533105/9942600

? ? ? ? 使用動態庫的示例代碼:http://download.csdn.net/download/yzf279533105/9942605

總結

以上是生活随笔為你收集整理的tinyxml在linux和windows下的编译及使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。