• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            lynch

            C++ libxml2編程基礎(chǔ)(Ubuntu系統(tǒng))

                Libxml2 是一個(gè)xml c語(yǔ)言版的解析器,本來(lái)是為Gnome項(xiàng)目開發(fā)的工具,是一個(gè)基于MIT License的免費(fèi)開源軟件。它除了支持c語(yǔ)言版以外,還支持c++、PHP、Pascal、Ruby、Tcl等語(yǔ)言的綁定,能在Windows、Linux、Solaris、MacOsX等平臺(tái)上運(yùn)行。功能還是相當(dāng)強(qiáng)大的,相信滿足一般用戶需求沒(méi)有任何問(wèn)題。
               本文主要簡(jiǎn)單介紹一下libxml2在linux下的C++使用的基礎(chǔ),操作系統(tǒng)為Ubuntu。 
               一、libxml2的安裝
                1、下載libxml2
                       地址ftp://xmlsoft.org/libxml2/,這里選擇的是libxml2-2.8.0.tar.gz
                2、解壓
            1. tar zxvf libxml2-2.8.0.tar.gz
                3、配置安裝
            1. ./configure
            2. make
            3. sudo make install
                4、安裝libxml-dev
            1. sudo apt-get install libxml2-dev
                5、把libxml2下的libxml拷貝一份到libxml2所在的目錄
            1. sudo cp -/usr/include/libxml2/libxml /usr/include/libxml
                6、包含libxml2的測(cè)試程序在編譯的時(shí)候需要引用xml2庫(kù),比如測(cè)試程序test.cpp,則在編譯的時(shí)候應(yīng)該:
            1. g++ test.cpp -lxml2
               二、libxml2常用數(shù)據(jù)類型
               xmlChar是libxml2中的字符類型,在庫(kù)中的所有字符,字符串都是基于這個(gè)數(shù)據(jù)類型的。
               xmlChar*是指針類型,很多函數(shù)都會(huì)返回一個(gè)動(dòng)態(tài)分配的內(nèi)存的xmlChar*類型的變量,因此,在使用這類函數(shù)時(shí)要記得釋放內(nèi)存,否則會(huì)導(dǎo)致內(nèi)存泄漏,例如這樣的用法:
            1. xmlChar *name = xmlNodeGetContent(CurNode);
            2. strcpy(data.name, name);
            3. xmlFree(name);
                xmlDoc、 xmlDocPtr       //文檔對(duì)象結(jié)構(gòu)體及指針
                xmlNode、 xmlNodePtr   //節(jié)點(diǎn)對(duì)象結(jié)構(gòu)體及節(jié)點(diǎn)指針
                xmlAttr、 xmlAttrPtr      //節(jié)點(diǎn)屬性的結(jié)構(gòu)體及其指針
                xmlNs、 xmlNsPtr          //節(jié)點(diǎn)命名空間的結(jié)構(gòu)及指針
                BAD_CAST                   //一個(gè)宏定義,事實(shí)上它即是xmlChar*類型
                三、libxml2常用函數(shù)
                1、文檔相關(guān)函數(shù)
                      int xmlKeepBlankDefault(int val);     //設(shè)置是否忽略空白的節(jié)點(diǎn),在解析之前一般要調(diào)用,默認(rèn)值為0,最好設(shè)置成為1
                      xmlDocPtr    xmlParseFile(const *filename);   //分析一個(gè)xml文件,并返回一個(gè)xml文檔的對(duì)象指針
                      xmlReadFile            //讀入一個(gè)帶有某種編碼的xml文檔,并返回一個(gè)文檔指針
                      xmlSaveFile            //將文檔以默認(rèn)方式保存
                      xmlSaveFormatFileEnc   //可將文檔以某種編碼/格式的方式進(jìn)行保存
                      xmlFreeDoc         //釋放文檔指針    注意:當(dāng)調(diào)用此函數(shù)時(shí),該文檔所包含的所有節(jié)點(diǎn)內(nèi)存都將被自動(dòng)釋放。一般來(lái)說(shuō),一個(gè)文檔中所有的節(jié)點(diǎn)都應(yīng)該動(dòng)態(tài)分配然后加入文檔,然后調(diào)用xmlFreeDoc函數(shù)一次性的釋放所有節(jié)點(diǎn)動(dòng)態(tài)分配的內(nèi)存;但是當(dāng)節(jié)點(diǎn)從文檔中移除時(shí),就需要調(diào)用xmlFreeNode或者是xmlFreeNodeList。
                2、根節(jié)點(diǎn)相關(guān)函數(shù)
                      xmlNodePtr  xmlDocGetRootElement(xmlDocPtr  doc);    //獲得文檔的根節(jié)點(diǎn)
                      xmlNodePtr xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root);   //設(shè)置文檔的根節(jié)點(diǎn)
                3、創(chuàng)建子節(jié)點(diǎn)相關(guān)函數(shù)
                      xmlNodePtr   xmlNewNode(xmlNsPtr ns, const xmlChar *name);   //創(chuàng)建一個(gè)新節(jié)點(diǎn)
                      xmlNodePtr   xmlNewChild(xmlNodePtr  parent, xmlNsPtr ns, const xmlChar *name, const xmlChar *content);    // 創(chuàng)建一個(gè)新的字節(jié)點(diǎn)
                      xmlNodePtr   xmlCopyNode(const xmlNodePtr curNode, int extended);    //復(fù)制當(dāng)前節(jié)點(diǎn)
                      xmlNodeSetContent                         //設(shè)置節(jié)點(diǎn)內(nèi)容
                      xmlNodeGetContent                        //獲取節(jié)點(diǎn)內(nèi)容
                      xmlNodeListGetString                     //獲取字符串
                4、添加字節(jié)點(diǎn)相關(guān)函數(shù)
                      xmlNodePtr   xmlAddChild(xmlNodePtr parent, xmlNodePtr curNode);  //給指定的節(jié)點(diǎn)添加子節(jié)點(diǎn)
                      xmlNodePtr   xmlAddNextSibling(xmlNodePtr curNode, xmlNodePtr brother);   //添加兄弟節(jié)點(diǎn)到后面
                      xmlNodePtr   xmlAddPrevSibling(xmlNodePtr curNode, xmlNodePtr brother);   //添加兄弟節(jié)點(diǎn)到前面
                      xmlNodePtr   xmlAddSibling(xmlNodePtr curNode, xmlNodePtr brother);   //添加一個(gè)兄弟節(jié)點(diǎn)
                5、屬性相關(guān)函數(shù)
                      xmlAttrPtr  xmlNewProp(xmlNodePtr curNode, const xmlChar *name, const xmlChar *value);//創(chuàng)建新節(jié)點(diǎn)屬性
                      xmlAttrPtr  xmlSetProp(xmlNodePtr curNode, const xmlChar *name, const xmlChar *value);//設(shè)置新節(jié)點(diǎn)屬性
                      xmlAttrPtr  *xmlGetProp(xmlNodePtr curNode, const xmlChar *name, const xmlChar *value);//讀取節(jié)點(diǎn)屬性  
                6、使用XPATH查找xml文檔
                     使用XPATH的流程如下:
                      1、定義一個(gè)XPATH的上下文指針xmlXPathContextPtr context,并且使用函數(shù)xmlXPathNewContext來(lái)初始化該指針;
                      2、定義一個(gè)XPATH的對(duì)象指針xmlXPathObjectPtr obj,并使用函數(shù)xmlXPathEvalExpression來(lái)計(jì)算XPATH的表達(dá)式,得到查詢結(jié)果,將結(jié)果存入對(duì)象指針當(dāng)中;
                      3、使用obj->nodesetval得到節(jié)點(diǎn)集合指針,在其中包含了所有查詢到的XPATH節(jié)點(diǎn);
                      4、使用函數(shù)xmlXPathFreeContext來(lái)釋放上下文指針;
                      5、最后使用函數(shù)xmlXPathFreeObject釋放XPATH對(duì)象指針。
                四、XML文件創(chuàng)建

            1.  #include<iostream> 
            2.  #include<libxml/parser.h> 
            3.  #include<libxml/xpath.h> 
            4.  #include<libxml/tree.h> 
            5.                                                                        
            6.  using namespace std; 
            7.                                                                        
            8.  int main(){ 
            9.      xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0"); 
            10.      xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root"); 
            11.      //set root node 
            12.      xmlDocSetRootElement(doc,root_node); 
            13.      //create nodes under root node 
            14.      xmlNewTextChild(root_node,NULL,BAD_CAST"IP",BAD_CAST"192.168.1.116");
            15.      xmlNewTextChild(root_node,NULL,BAD_CAST"Port",BAD_CAST"65535"); 
            16.      xmlNewTextChild(root_node,NULL,BAD_CAST"num",BAD_CAST"1000"); 
            17.      //create a new node,set its content and attributes,then add it to root node
            18.      xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2"); 
            19.      xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT"); 
            20.      //add node to root node 
            21.      xmlAddChild(root_node,node); 
            22.      xmlAddChild(node,content); 
            23.      xmlNewProp(node,BAD_CAST"attribute",BAD_CAST"yes"); 
            24.      //create a son node and a grandson one 
            25.      node = xmlNewNode(NULL,BAD_CAST"son"); 
            26.      xmlAddChild(root_node,node); 
            27.      xmlNodePtr grandson = xmlNewNode(NULL,BAD_CAST"grandson"); 
            28.      xmlAddChild(node,grandson); 
            29.      xmlAddChild(grandson,xmlNewText(BAD_CAST"This is a grandson node"));
            30.      //save xml doc 
            31.      int ret = xmlSaveFile("create.xml",doc); 
            32.      if(ret != -1){ 
            33.          cout<<"A xml doc is created;Write in "<<ret<<" bytes"<<endl; 
            34.      } 
            35.      xmlFreeDoc(doc); 
            36.      return 0; 
            37.  }
                        編譯:g++  build.cc -lxml2
                        運(yùn)行:打開create.xml

            1. <?xml version="1.0"?> 
            2.    <root> 
            3.        <IP>192.168.1.116</IP> 
            4.        <Port>65535</Port> 
            5.        <num>1000</num> 
            6.        <node2 attribute="yes">NODE CONTENT</node2> 
            7.        <son> 
            8.            <grandson>This is a grandson node</grandson> 
            9.        <son> 
            10.    </root>
                五、XML文件解析
                 xml文件

            1. <?xml version="1.0"?> 
            2.    <root> 
            3.        <IP>192.168.1.116</IP> 
            4.        <Port>65535</Port> 
            5.        <num>1000</num> 
            6.        <node2 attribute="yes">NODE CONTENT</node2> 
            7.        <son> 
            8.            <grandson>This is a grandson node</grandson> 
            9.        <son> 
            10.    </root>
                 解析代碼:

            1. #include<iostream> 
            2.  #include<libxml/parser.h> 
            3.  //#include<libxml/xmlmemory.h> 
            4.  #include<string> 
            5.                                                                        
            6.  using namespace std; 
            7.                                                                        
            8.  const char* xmlConfig="create.xml"; 
            9.                                                                        
            10.  int main(){ 
            11.      xmlDocPtr doc; 
            12.      xmlNodePtr curNode; 
            13.      xmlChar* szKey; 
            14.                                                                        
            15.      doc = xmlParseFile(xmlConfig); 
            16.      if(doc == NULL){ 
            17.          cout<<"Document not parsed successfully!"<<endl; 
            18.          return -1; 
            19.      } 
            20.      //cout<<"Document parsed successfully!"<<endl; 
            21.      curNode = xmlDocGetRootElement(doc); 
            22.      if(curNode == NULL){ 
            23.          cout<<"empty document.\n"<<endl; 
            24.          xmlFreeDoc(doc); 
            25.          return -1; 
            26.      } 
            27.      //cout<<"xmlDocGetRootElement OK.\n"<<endl; 
            28.      if(xmlStrcmp(curNode->name,BAD_CAST"root")){ 
            29.          cerr<<"root node is not 'root'"<<endl; 
            30.          xmlFreeDoc(doc); 
            31.          return -1; 
            32.      } 
            33.      curNode = curNode->xmlChildrenNode; 
            34.      xmlNodePtr propNodePtr = curNode; 
            35.      while(NULL != curNode){ 
            36.          if((!xmlStrcmp(curNode->name,(const xmlChar*)"IP"))){ 
            37.              szKey = xmlNodeGetContent(curNode); 
            38.              cout<<"IP:"<<szKey<<endl; 
            39.              //string s((char*)szKey); 
            40.              xmlFree(szKey); 
            41.              //cout<<s<<endl; 
            42.          }else if((!xmlStrcmp(curNode->name,(const xmlChar*)"Port"))){
            43.              szKey = xmlNodeGetContent(curNode); 
            44.              cout<<"Port:"<<szKey<<endl; 
            45.              xmlFree(szKey); 
            46.          }else if((!xmlStrcmp(curNode->name,(const xmlChar*)"num"))){ 
            47.              szKey = xmlNodeGetContent(curNode); 
            48.              cout<<"num:"<<szKey<<endl; 
            49.              xmlFree(szKey); 
            50.          } else if((!xmlStrcmp(curNode->name,(const xmlChar*)"node2"))){
            51.              szKey = xmlNodeGetContent(curNode); 
            52.              cout<<"node2:"<<szKey<<endl; 
            53.              xmlFree(szKey); 
            54.              // get attributes 
            55.              szKey = xmlGetProp(curNode,(const xmlChar*)"attribute"); 
            56.              cout<<"node2->attribute:"<<szKey<<endl; 
            57.              xmlFree(szKey); 
            58.          } 
            59.          curNode= curNode->next; 
            60.      } 
            61.                                                                        
            62.      return 0; 
            63.  }

            posted on 2012-12-14 14:08 董三 閱讀(2508) 評(píng)論(1)  編輯 收藏 引用 所屬分類: C++

            評(píng)論

            # re: C++ libxml2編程基礎(chǔ)(Ubuntu系統(tǒng)) 2012-12-14 19:58 eryar

            Good!
            Mark...  回復(fù)  更多評(píng)論   

            <2012年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            博客友

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久大香香蕉国产| 国产精品99久久久久久猫咪| 久久久久久久久久久精品尤物| 伊人 久久 精品| 久久精品免费一区二区三区| 久久国产精品免费一区| 久久亚洲精品成人AV| 国产精品久久久天天影视香蕉| 久久婷婷五月综合97色直播| 久久精品国产91久久麻豆自制| 亚洲午夜久久久| 香蕉久久一区二区不卡无毒影院| 久久无码AV中文出轨人妻| 精品久久久久久中文字幕| 中文字幕人妻色偷偷久久| 国产A级毛片久久久精品毛片| 精品国产乱码久久久久软件| 久久精品国产99国产精品| 久久w5ww成w人免费| 亚洲欧美精品一区久久中文字幕 | 国产精品久久久久久久| 一级a性色生活片久久无少妇一级婬片免费放 | 色综合合久久天天给综看| 东京热TOKYO综合久久精品| 久久精品免费全国观看国产| 久久狠狠色狠狠色综合| 无码人妻久久一区二区三区免费 | 久久国语露脸国产精品电影| 久久精品免费网站网| 国内精品久久久久久久久| 国产精品久久久久…| 国产精品99久久免费观看| 久久免费的精品国产V∧| 性欧美丰满熟妇XXXX性久久久 | 国产一级做a爰片久久毛片| 麻豆成人久久精品二区三区免费 | 国产精品VIDEOSSEX久久发布| 国产综合久久久久久鬼色| 久久精品亚洲精品国产色婷| 久久婷婷成人综合色综合| 久久精品欧美日韩精品|