1. 程式人生 > >Linux下的xml檔案的解析

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());

但是要求字串沒有回車每個結點之間不能有空格

例如: <><><><><>緊湊排列