1. 程式人生 > >windows 系統在vs2010 中配置libxml2,及讀取xml程式碼例子

windows 系統在vs2010 中配置libxml2,及讀取xml程式碼例子

1、先下載libxml2 (下載地址 http://download.csdn.net/detail/luoww1/8095273),裡面包括了三個資料夾分別:zlib-1.2.3.win32 和iconv-1.9.2.win32 和libxml2-2.7.6.win32

2、將下載內容中的iconv.dll 和zlib1.dll 拷貝到C盤下的Windows資料夾中

3、在專案中新建include 資料夾,解壓的到的libxml2和iconv中的include資料夾中的內容拷入到該include資料夾中,若專案名稱為proxyServer,目錄結構如圖所示


4、VS2010專案proxyServer,右擊,選擇“屬性”-->C/C++-->常規 在附加包含目錄中新增

.\include

5、將iconv.lib 和iconv_a.lib和libxml2.lib和libxml2_a.lib放在專案根目錄中,可見上面的圖片

6、VS2010專案proxyServer,右擊,選擇“屬性”-->連結器-->輸入中新增

iconv.lib ;iconv_a.lib;libxml2.lib;libxml2_a.lib

</pre>7、工程中用libxml2讀取xml檔案的程式碼<pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int main(int argc, char** argv) {
xmlDocPtr doc;           //定義解析文件指標
    xmlNodePtr curNode;      //定義結點指標(你需要它為了在各個結點間移動)
    xmlChar *szKey;          //臨時字串變數
    char szDocName[] = "Device.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;
    }
    /*在這個例子中,我們需要確認文件是正確的型別。“Devices”是在這個示例中使用文件的根型別。*/
    if (xmlStrcmp(curNode->name, BAD_CAST "Devices"))
    {
       //分析根元素失敗
       xmlFreeDoc(doc);
       return -3;
    }
    curNode = curNode->xmlChildrenNode;
    xmlNodePtr propNodePtr = curNode;//xmlNodePtr 節點列表的指標
    while(curNode != NULL)
    {
       //取出節點中的內容
       if ((!xmlStrcmp(curNode->name, (const xmlChar *)"Device")))  //取出節點Device的內容
       {
           szKey = xmlNodeGetContent(curNode);//獲取內容
           cout << szKey << endl; 
           xmlFree(szKey);
       }
       //查詢帶有屬性url的節點
       if (xmlHasProp(curNode,BAD_CAST "url"))
       {
           propNodePtr = curNode;	
		   //cout<< xmlGetProp(propNodePtr,BAD_CAST "url") <<endl;//輸出URL的值			
       }
       curNode = curNode->next;
    }
  //查詢屬性
    xmlAttrPtr attrPtr = propNodePtr->properties; //xmlAttrPtr 屬性列表的指標
    while (attrPtr != NULL)
    {
       if (!xmlStrcmp(attrPtr->name, BAD_CAST "url"))
       {
           xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "url");
           cout << szAttr << endl; //找到url的屬性
           xmlFree(szAttr);
       }
       attrPtr = attrPtr->next;
    }

    xmlFreeDoc(doc);//函式關閉文件指標,並清除本文件中所有節點動態申請的記憶體
}
8、Device.xml 檔案的內容
<?xml version="1.0" encoding="GB2312"?>
<Devices>
	<Device  url="www.baidu.com"  />
	<Device url="www.taobao.com"/>
</Devices>