Linux下的xml檔案的解析
解析一個xml文件,從中取出想要的資訊,例如節點中包含的文字,或者某個節點的屬性,其流程如下:
l 用xmlReadFile函式讀出一個文件指標doc;
l 用xmlDocGetRootElement函式得到根節點curNode;
l curNode->xmlChildrenNode就是根節點的子節點集合;
l 輪詢子節點集合,找到所需的節點,用xmlNodeGetContent取出其內容;
l 用xmlHasProp查詢含有某個屬性的節點;
l 取出該節點的屬性集合,用xmlGetProp取出其屬性值;
l 用xmlFreeDoc函式關閉文件指標,並清除本文件中所有節點動態申請的記憶體。
注意:節點列表的指標依然是xmlNodePtr,屬性列表的指標也是xmlAttrPtr,並沒有xmlNodeList或者xmlAttrList這樣的型別。看作列表的時候使用它們的next和prev連結串列指標來進行輪詢。只有在Xpath中有xmlNodeSet這種型別,其使用方法前面已經介紹了。
程式例項1:
#include </usr/include/libxml2/libxml/parser.h>
#include </usr/include/libxml2/libxml/tree.h>
int main(int argc , char **argv)
{
//定義文件指標以便後面獲取文件指標
xmlDocPtr pdoc = NULL;
//定義一個根結點
xmlNodePtr proot=NULL , pcurnode = NULL;
//要解析的檔案
char *psfilename=(const char*)"input.xml";
//獲取要讀的檔案數並傳指標
pdoc = xmlReadFile(psfilename ,"UTF-8",XML_PARSE_RECOVER);
//判斷指標是否獲取成功,失敗的情況
if(NULL == pdoc)
{
printf("error: open file %s" , psfilename);
exit(1);
}
//獲取根結點給pcurnode
pcurnode = xmlDocGetRootElement(pdoc);
//判斷根結點是否獲取成功
if(NULL == pcurnode)
{
printf("error: empty document %s" , psfilename);
exit(1);
}
//判斷此結點是不是想要的結點(通過名字比較),相同為0,不同為1
if(xmlStrcmp(pcurnode->name , BAD_CAST "plist") != 0)
{
printf("error document " );
exit(1);
}
//如果該結點擁有此屬性,進行輸出屬性值
if(xmlHasProp(pcurnode ,BAD_CAST "version"))
{
//先獲取相應屬性值
xmlChar *szAttr = xmlGetProp(pcurnode, BAD_CAST "version");
//輸出此屬性值
printf("version : %s \n" , szAttr);
}
//釋放文件指標
xmlFreeDoc(pdoc);
xmlCleanupParser();
return(0);
}
涉及函式:
xmlParseFile,xmlReadFile,xmlDocGetRootElement,xmlHasProp,xmlGetProp。其中xmlParseFile和xmlReadFile都具備開啟XML檔案的功能,xmlParseFile函式以預設方式讀入一個UTF-8格式的文件,並返回文件指標。xmlReadFile函式讀入一個帶有某種編碼的xml文件,並返回文件指標。
解析字串xml的話就需要:
string s;
pdoc = xmlRecoverDoc(BAD_CAST s.c_str());
但是要求字串沒有回車每個結點之間不能有空格
例如: <><><><><>緊湊排列