青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

lynch

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

    Libxml2 是一個(gè)xml c語(yǔ)言版的解析器,本來(lái)是為Gnome項(xiàng)目開(kāi)發(fā)的工具,是一個(gè)基于MIT License的免費(fèi)開(kā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ù)類(lèi)型
   xmlChar是libxml2中的字符類(lèi)型,在庫(kù)中的所有字符,字符串都是基于這個(gè)數(shù)據(jù)類(lèi)型的。
   xmlChar*是指針類(lèi)型,很多函數(shù)都會(huì)返回一個(gè)動(dòng)態(tài)分配的內(nèi)存的xmlChar*類(lèi)型的變量,因此,在使用這類(lèi)函數(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*類(lèi)型
    三、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)行:打開(kāi)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 董三 閱讀(2545) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): 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)

隨筆分類(lèi)

隨筆檔案

文章分類(lèi)

文章檔案

博客友

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲日本va在线观看| 亚洲欧美综合精品久久成人| 亚洲精品国产品国语在线app| 国产精品无码专区在线观看| 欧美精品一区二区三区久久久竹菊 | 国产欧美一区二区三区久久人妖| 久久亚洲视频| 欧美成人免费观看| 欧美日韩精品欧美日韩精品 | 国产欧美亚洲视频| 国产伦精品一区二区三区免费迷 | 国产欧美亚洲精品| 国产真实乱偷精品视频免| 韩日视频一区| 一区二区三区日韩欧美| 午夜精品视频在线观看| 欧美一区二区三区四区夜夜大片| 亚洲欧美精品suv| 久久影院午夜片一区| 亚洲人成网站影音先锋播放| 亚洲欧洲一级| 久久男人资源视频| 国产欧美日韩亚洲一区二区三区| 国外成人在线视频网站| 亚洲午夜激情| 欧美激情亚洲视频| 欧美中文在线免费| 国产精品日韩在线观看| 日韩视频永久免费| 久久久久久日产精品| 一本综合精品| 另类av导航| 香蕉久久a毛片| 国产精品久久久久久影视| 亚洲精品久久久久久一区二区 | 亚洲电影免费观看高清完整版在线观看 | 亚洲一区影院| 亚洲日本精品国产第一区| 久久婷婷国产麻豆91天堂| 在线看片成人| 欧美成年人在线观看| 久久综合网络一区二区| 在线精品在线| 91久久国产综合久久蜜月精品 | 亚洲视频久久| 欧美午夜一区二区| 亚洲欧美三级在线| 久久精品成人一区二区三区蜜臀| 国产一在线精品一区在线观看| 久久久亚洲精品一区二区三区| 久久深夜福利免费观看| 99精品视频免费观看| 亚洲一级黄色av| 久久免费视频观看| 夜夜嗨av色一区二区不卡| 一本一本大道香蕉久在线精品| 国产精品夜色7777狼人| 欧美成人在线网站| 国产亚洲成精品久久| 欧美激情成人在线视频| 国产精品乱人伦中文| 欧美xxx在线观看| 国产欧美va欧美va香蕉在| 美女久久一区| 欧美r片在线| 欧美日韩精品欧美日韩精品| 羞羞视频在线观看欧美| 快射av在线播放一区| 亚洲免费综合| 欧美巨乳在线观看| 久久亚洲春色中文字幕久久久| 欧美精品黄色| 欧美激情黄色片| 亚洲成在线观看| 久久精品色图| 老牛影视一区二区三区| 国产亚洲精品久久久久久| 亚洲综合好骚| 久久国产欧美日韩精品| 国产精品私房写真福利视频| 在线视频精品一区| 欧美一区1区三区3区公司| 国产精品男人爽免费视频1| 日韩一区二区高清| 午夜精品久久久久久久蜜桃app | 亚洲人成网在线播放| 久久国产精品亚洲77777| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧美在线磁力| 国产亚洲欧美一区| 久久久噜噜噜久久中文字幕色伊伊| 久久成人久久爱| 一区福利视频| 欧美激情一区二区三区在线视频| 亚洲第一福利在线观看| 亚洲六月丁香色婷婷综合久久| 欧美日韩在线一二三| 亚洲在线日韩| 毛片一区二区| 亚洲一区欧美二区| 黄色精品在线看| 欧美激情视频一区二区三区不卡| 久久久女女女女999久久| 亚洲成在人线av| 亚洲欧美久久久久一区二区三区| 国产原创一区二区| 欧美精品手机在线| 午夜欧美大尺度福利影院在线看| 一区二区高清视频| 欧美日本韩国| 老司机午夜精品视频在线观看| 亚洲性av在线| 亚洲精品资源美女情侣酒店| 久久夜色精品国产欧美乱极品| 一本色道久久综合狠狠躁篇的优点 | 久久综合给合久久狠狠色 | 国产精品一区一区| 欧美啪啪一区| 欧美午夜精品一区| 欧美网站大全在线观看| 欧美日韩亚洲系列| 国产精品久久7| 国产精品一卡二| 国产在线播放一区二区三区| 国产一区二区三区在线免费观看 | 欧美在线亚洲一区| 亚洲欧美日韩在线| 久久99在线观看| 久久综合伊人77777| 美国成人毛片| 欧美日韩中文在线观看| 国产日韩精品综合网站| 亚洲国产91| 午夜精品理论片| 免费在线成人| 亚洲一区二区三区在线视频| 久久不见久久见免费视频1| 欧美激情第8页| 国产一区美女| 亚欧成人在线| 亚洲精美视频| 久久精品亚洲乱码伦伦中文| 欧美精品自拍偷拍动漫精品| 国内精品视频666| 亚洲综合色网站| 亚洲国产精品成人综合| 欧美一区二区在线| 国产精品久久久久久五月尺| 91久久香蕉国产日韩欧美9色| 欧美在线播放视频| 一区二区三区久久精品| 欧美国产一区视频在线观看| 99视频日韩| 欧美日韩精品欧美日韩精品一| 亚洲国产精品黑人久久久| 老司机成人网| 久久一区视频| 亚洲精品一区二区三区蜜桃久| 乱中年女人伦av一区二区| 久久国内精品视频| 国产综合色在线视频区| 久久久国产91| 久久一二三国产| 亚洲美女啪啪| 99精品国产在热久久婷婷| 欧美日韩在线一区| 久久久久久一区二区| 久久综合色婷婷| 亚洲一级黄色| 久久精品国产欧美激情| 亚洲黄色成人网| 亚洲综合视频网| 亚洲国产精品高清久久久| 最新亚洲激情| 国产在线精品成人一区二区三区 | 免费视频一区| 欧美色视频一区| 久久婷婷国产麻豆91天堂| 欧美成人精品h版在线观看| 亚洲一区日韩| 欧美大胆成人| 久久人91精品久久久久久不卡| 欧美成人影音| 欧美成人国产一区二区| 国产精品久久久久久一区二区三区 | 亚洲视频在线观看一区| 久久久精品2019中文字幕神马| 在线一区日本视频| 免费久久精品视频| 国产女人水真多18毛片18精品视频| 欧美高清视频一区二区| 国产九区一区在线| 亚洲一区www| 亚洲一区综合| 国产精品视频xxx| 午夜精品婷婷| 久久国产主播精品| 国产亚洲精品自拍| 欧美一级大片在线观看| 香蕉免费一区二区三区在线观看 |