tinyxml解析xml檔案
一、tinyxml 庫
tinyxml 開源精簡版本xml 解析庫,相比於libxml2 更適合使用於嵌入式裝置當中xml資料的解析和構造
TiXmlBase Class Reference
下載TinyXML的網址:
二、tinyxml 編譯成.so
1、將tinyxml 拷貝到/home/work/目錄下
cp tinyxml /home/work/tinyxml
cd /home/work/tinyxml/
2、修改Makefile
vim Makefile
28 DEBUG_CFLAGS := -Wall -Wno-format -g -DDEBUG
-fpic -shared
29 RELEASE_CFLAGS := -Wall -Wno-unknown-pragmas -Wno-format -O3
-fpic -shared # 新增 -fpic -shared 生成動態庫引數
84 OUTPUT := libtinyxml.so # 設定輸出lib庫
93 SRCS := tinyxml.cpp tinyxmlparser.cpp tinyxmlerror.cpp tinystr.cpp #
刪掉原本編譯進去的xmltest.cpp
105 ${LD} -o
3、編譯生成 libtinyxml.so
make
4、交叉編譯移植tinyxml 到開發板,需要修改
22 CC := arm-linux-gcc
23 CXX := arm-linux-g++
24 LD := arm-linux-g++
25 AR := arm-linux-ar rc
三、編寫測試例子
1、解析xml 資料 <xxxxx>data</xxxxxx> 形式存放的xml資料
test.xml 內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Message xmlns="http://mns.aliyuncs.com/doc/v1">
<MessageId>6D438C3EE5E6E031-1-1579E5A156F-20000000E</MessageId>
<MessageBodyMD5>009F8E6EDCA8CA12AB5F82F5EBE514F7</MessageBodyMD5>
<MessageBody>{"title":"text","content":"測試訊息"}</MessageBody>
<ReceiptHandle>1-ODU4OTkzNDYwNi0xNDc1ODM0MjI3LTEtOA==</ReceiptHandle>
<EnqueueTime>1475830486383</EnqueueTime>
<FirstDequeueTime>1475831421138</FirstDequeueTime>
<NextVisibleTime>1475834227000</NextVisibleTime>
<DequeueCount>2</DequeueCount>
<Priority>8</Priority>
</Message>
以上xml資料都是以 <xxxxx>data</xxxxxx> 形式存放的xml資料
對應的解析程式如下:
#include <stdio.h>
#include "tinyxml.h"
int test_xml(const char *xmlfile)
{
TiXmlDocument* myDocument = new TiXmlDocument();
myDocument->LoadFile(xmlfile);
TiXmlElement* rootElement = myDocument->RootElement();
if (rootElement == NULL || strcmp(rootElement->Value(), "Message"))
return -1;
printf("%s:\t %s \n", rootElement->Value(), rootElement->GetText());
TiXmlElement* element = rootElement->FirstChildElement();
if (element == NULL || strcmp(element->Value(), "MessageId"))
return -1;
printf("%s:\t %s \n", element->Value(), element->GetText());
while(1){
element = element->NextSiblingElement();
if(element == NULL){
break;
}
printf("%s:\t%s\n", element->Value(), element->GetText());
}
myDocument->Clear();
delete myDocument;
}
int main(int argc, char* argv[])
{
if(argc<2){
printf("input xml file\n");
return -1;
}
test_xml((const char *)argv[1]);
return 0;
}
2、解析item 型別的xml資料
xml資料格式如下:
<ToDo>
<Item priority="1">
<bold>
Book store!
</bold>
</Item>
<Item priority="2">
book1
</Item>
<Item priority="2">
book2
</Item>
</ToDo>
解析原始碼:
#include <stdio.h>
#include <iostream>
#include <string>
#include "tinyxml.h"
using namespace std;
int loadXML(const char *xmlfile)
{
TiXmlDocument doc;
if(!doc.LoadFile(xmlfile)){
cerr << doc.ErrorDesc() << endl;
return FAILURE;
}
TiXmlElement* root = doc.FirstChildElement();
if(root == NULL)
{
cerr << "Failed to load file: No root element." << endl;
doc.Clear();
return FAILURE;
}
for(TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement())
{
string elemName = elem->Value();
const char* attr;
attr = elem->Attribute("priority");
printf("attr = %s\n",attr);
if(strcmp(attr,"1")==0)
{
TiXmlElement* e1 = elem->FirstChildElement("bold");
TiXmlNode* e2=e1->FirstChild();
cout<<"priority=1\t"<<e2->ToText()->Value()<<endl;
}
else if(strcmp(attr,"2")==0)
{
TiXmlNode* e1 = elem->FirstChild();
cout<<"priority=2\t"<<e1->ToText()->Value()<<endl;
}
}
doc.Clear();
return 0;
}
int main(int argc, char* argv[])
{
if(argc<2){
printf("input xml file\n");
return -1;
}
if(loadXML(argv[1]))
return -1;
return 0;
}
3、生成xml資料
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "tinyxml.h"
using namespace std;
int saveXML(const char *file){
TiXmlDocument doc;
TiXmlElement* root = new TiXmlElement("root");
doc.LinkEndChild(root);
TiXmlElement* element1 = new TiXmlElement("Element1");
root->LinkEndChild(element1);
element1->SetAttribute("attribute1", "some value");
TiXmlElement* element2 = new TiXmlElement("Element2"); ///元素
root->LinkEndChild(element2);
element2->SetAttribute("attribute2", "2");
element2->SetAttribute("attribute3", "3");
TiXmlElement* element3 = new TiXmlElement("Element3");
element2->LinkEndChild(element3);
element3->SetAttribute("attribute4", "4");
TiXmlText* text = new TiXmlText("Some text."); ///文字
element2->LinkEndChild(text);
bool success = doc.SaveFile((char *)file);
doc.Clear();
if(success)
return 0;
else
return -1;
}
int main(int argc, char* argv[]){
if(argc<2){
printf("input save file \n");
return -1;
}
if(saveXML((const char *)argv[1]))
return -1;
printf("save xml ok \n");
return 0;
}
生成的xml內容如下:
<root>
<Element1 attribute1="some value" />
<Element2 attribute2="2" attribute3="3">
<Element3 attribute4="4" />Some text.
</Element2>
</root>