C++中使用libxml2讀取xml檔案
阿新 • • 發佈:2019-02-19
linux下,純c++使用libxml2讀取xml檔案
下載libxml2
[url]ftp://ftp.xmlsoft.org/libxml2/libxml2-sources-2.7.1.tar.gz[/url]
常規方法進行安裝
#tar xvzf libxml2-xxxx.tar.gz
#./configure
#make
#make install
把libxml2下的libxml拷貝一份到libxml2所在的目錄
#cp /usr/include/libxml2/libxml /usr/include/libxml
這一步不是必需的,但是在筆者的機器上不這樣做就不行,編譯的時候想
g++ a.cpp -llibxml2 -o a 這樣指定一下發現parser.h但是發現parser.h裡面
定義的庫全是include<libxml/parser.h>.而parser.h的實際位置是在<libxml2\
libxml/parser.h>,沒辦法了,但是這樣拷貝一下就好了
現在要說一下xml檔案了,筆者要讀取了xml有兩種格式,一種
<root>
<node1>aaaaa</node1>
<node2>bbbbb</node2>
</root>
一種
<root>
<node1 a="10">aaaaa</node1>
<node2 b="20">bbbbb</node2>
</root>
整理一下,本文要讀取的d.xml為
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<node1 a="10">aaaaa</node1>
<node2 b="20">bbbbb</node2>
</root>
目的為取出其它的 b的值和node2的屬性值
OK,開工
#include <iostream>
#include <libxml/parser.h>
int main(int argc, char *argv[])
{
xmlDocPtr doc; //定義解析文件指標
xmlNodePtr curNode; //定義結點指標(你需要它為了在各個結點間移動)
xmlChar *szKey; //臨時字串變數
char szDocName[] = "d.xml";
using std::string;
using std::cout;
using std::endl;
doc = xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析檔案
//檢查解析文件是否成功,如果不成功,libxml將指一個註冊的錯誤並停止。
//一個常見錯誤是不適當的編碼。XML標準文件除了用UTF-8或UTF-16外還可用其它編碼儲存。
//如果文件是這樣,libxml將自動地為你轉換到UTF-8。更多關於XML編碼資訊包含在XML標準中.
if (NULL == doc)
{
//文件開啟錯誤
return -1;
}
curNode = xmlDocGetRootElement(doc); //確定文件根元素
/*檢查確認當前文件中包含內容*/
if (NULL == curNode)
{
//空得xml檔案
xmlFreeDoc(doc);
return -2;
}
/*在這個例子中,我們需要確認文件是正確的型別。“root”是在這個示例中使用文件的根型別。*/
if (xmlStrcmp(curNode->name, BAD_CAST "root"))
{
//分析根元素失敗
xmlFreeDoc(doc);
return -3;
}
curNode = curNode->xmlChildrenNode;
xmlNodePtr propNodePtr = curNode;
while(curNode != NULL)
{
//取出節點中的內容
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"node2")))
{
szKey = xmlNodeGetContent(curNode);
cout << szKey << endl; //得到node2的值並輸出
xmlFree(szKey);
}
//查詢帶有屬性attribute的節點
if (xmlHasProp(curNode,BAD_CAST "b"))
{
propNodePtr = curNode;
}
curNode = curNode->next;
}
//查詢屬性
xmlAttrPtr attrPtr = propNodePtr->properties;
while (attrPtr != NULL)
{
if (!xmlStrcmp(attrPtr->name, BAD_CAST "b"))
{
xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "b");
cout << szAttr << endl; //找到b的屬性並輸出
xmlFree(szAttr);
}
attrPtr = attrPtr->next;
}
xmlFreeDoc(doc);
return 0;
}
OK編譯一下:
g++ a.cpp -lxml2 -o a
$./a
bbbbb
20
成功得到所需要的值
下載libxml2
[url]ftp://ftp.xmlsoft.org/libxml2/libxml2-sources-2.7.1.tar.gz[/url]
常規方法進行安裝
#tar xvzf libxml2-xxxx.tar.gz
#./configure
#make
#make install
把libxml2下的libxml拷貝一份到libxml2所在的目錄
#cp /usr/include/libxml2/libxml /usr/include/libxml
這一步不是必需的,但是在筆者的機器上不這樣做就不行,編譯的時候想
g++ a.cpp -llibxml2 -o a 這樣指定一下發現parser.h但是發現parser.h裡面
定義的庫全是include<libxml/parser.h>.而parser.h的實際位置是在<libxml2\
libxml/parser.h>,沒辦法了,但是這樣拷貝一下就好了
現在要說一下xml檔案了,筆者要讀取了xml有兩種格式,一種
<root>
<node1>aaaaa</node1>
<node2>bbbbb</node2>
</root>
一種
<root>
<node1 a="10">aaaaa</node1>
<node2 b="20">bbbbb</node2>
</root>
整理一下,本文要讀取的d.xml為
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<node1 a="10">aaaaa</node1>
<node2 b="20">bbbbb</node2>
</root>
目的為取出其它的 b的值和node2的屬性值
OK,開工
#include <iostream>
#include <libxml/parser.h>
int main(int argc, char *argv[])
{
xmlDocPtr doc; //定義解析文件指標
xmlNodePtr curNode; //定義結點指標(你需要它為了在各個結點間移動)
xmlChar *szKey; //臨時字串變數
char szDocName[] = "d.xml";
using std::string;
using std::cout;
using std::endl;
doc = xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析檔案
//檢查解析文件是否成功,如果不成功,libxml將指一個註冊的錯誤並停止。
//一個常見錯誤是不適當的編碼。XML標準文件除了用UTF-8或UTF-16外還可用其它編碼儲存。
//如果文件是這樣,libxml將自動地為你轉換到UTF-8。更多關於XML編碼資訊包含在XML標準中.
if (NULL == doc)
{
//文件開啟錯誤
return -1;
}
curNode = xmlDocGetRootElement(doc); //確定文件根元素
/*檢查確認當前文件中包含內容*/
if (NULL == curNode)
{
//空得xml檔案
xmlFreeDoc(doc);
return -2;
}
/*在這個例子中,我們需要確認文件是正確的型別。“root”是在這個示例中使用文件的根型別。*/
if (xmlStrcmp(curNode->name, BAD_CAST "root"))
{
//分析根元素失敗
xmlFreeDoc(doc);
return -3;
}
curNode = curNode->xmlChildrenNode;
xmlNodePtr propNodePtr = curNode;
while(curNode != NULL)
{
//取出節點中的內容
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"node2")))
{
szKey = xmlNodeGetContent(curNode);
cout << szKey << endl; //得到node2的值並輸出
xmlFree(szKey);
}
//查詢帶有屬性attribute的節點
if (xmlHasProp(curNode,BAD_CAST "b"))
{
propNodePtr = curNode;
}
curNode = curNode->next;
}
//查詢屬性
xmlAttrPtr attrPtr = propNodePtr->properties;
while (attrPtr != NULL)
{
if (!xmlStrcmp(attrPtr->name, BAD_CAST "b"))
{
xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "b");
cout << szAttr << endl; //找到b的屬性並輸出
xmlFree(szAttr);
}
attrPtr = attrPtr->next;
}
xmlFreeDoc(doc);
return 0;
}
OK編譯一下:
g++ a.cpp -lxml2 -o a
$./a
bbbbb
20
成功得到所需要的值