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

lynch

C++ libxml2編程基礎(Ubuntu系統)

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

  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
            運行:打開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) 評論(1)  編輯 收藏 引用 所屬分類: C++

評論

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

Good!
Mark...  回復  更多評論   

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

導航

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

文章分類

文章檔案

博客友

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产综合久久久久久鬼色| 亚洲无玛一区| 午夜精品免费| 欧美在线亚洲在线| 久久精品日产第一区二区三区| 欧美一区免费| 老司机一区二区| 亚洲激情在线视频| 日韩一区二区电影网| 一级日韩一区在线观看| 亚洲免费在线观看视频| 久久久亚洲精品一区二区三区| 免费成人av| 国产精品久久久久9999吃药| 国内久久视频| 亚洲视频在线观看视频| 久久婷婷国产麻豆91天堂| 91久久久久久国产精品| 亚洲影视在线| 欧美成人一品| 国内精品久久国产| 日韩午夜电影在线观看| 欧美一区二区黄色| 亚洲国产欧美国产综合一区| 亚洲你懂的在线视频| 玖玖在线精品| 国产精品一区二区久久| 亚洲人成网站色ww在线| 欧美不卡视频一区发布| 亚洲精品一区二区三区婷婷月| 亚洲视频axxx| 久久亚洲私人国产精品va媚药| 欧美日韩高清在线播放| 在线不卡中文字幕| 欧美亚洲免费电影| 亚洲精品久久嫩草网站秘色| 欧美亚洲综合在线| 国产精品黄视频| 亚洲美女av黄| 牛人盗摄一区二区三区视频| 亚洲欧美日本视频在线观看| 欧美激情一区二区| 怡红院精品视频| 欧美在线视频二区| 日韩午夜av电影| 欧美福利视频| 亚洲第一主播视频| 六月天综合网| 久久国产精品久久w女人spa| 国产精品视频免费观看| 亚洲午夜久久久久久久久电影院 | 亚洲激精日韩激精欧美精品| 欧美中文在线免费| 亚洲少妇最新在线视频| 欧美精品在线免费播放| 亚洲美女精品一区| 亚洲国产高清高潮精品美女| 久久久亚洲欧洲日产国码αv| 国产欧美一区视频| 欧美在线播放高清精品| 亚洲一二三区在线| 国产精品国产三级国产专区53| 亚洲精品视频在线观看免费| 免费观看成人| 久久综合五月| 亚洲精品免费一区二区三区| 亚洲电影专区| 免费成人黄色| 日韩午夜激情电影| 99re8这里有精品热视频免费| 欧美精品在线视频| 亚洲色图自拍| 亚洲在线观看视频| 国产亚洲精品aa| 老牛影视一区二区三区| 久久久久久久一区二区| 亚洲高清一二三区| 亚洲日本理论电影| 国产精品高精视频免费| 欧美在线视频一区二区| 久久久久久久一区二区| 99视频超级精品| 亚洲一级黄色| 尤物精品国产第一福利三区 | 性欧美18~19sex高清播放| 欧美一区二区在线播放| 午夜精品久久| 国产午夜亚洲精品羞羞网站 | 久久亚洲私人国产精品va媚药| 欧美在线播放一区二区| 亚洲电影自拍| 中文网丁香综合网| 在线观看国产精品淫| 91久久一区二区| 国产精品视频久久| 女生裸体视频一区二区三区| 欧美日韩另类在线| 久久久免费精品视频| 欧美高清视频一区二区三区在线观看| 亚洲午夜在线观看| 久久嫩草精品久久久久| 亚洲小说欧美另类社区| 久久青草久久| 午夜影院日韩| 欧美精品97| 久热精品在线视频| 欧美日韩一区二区三区高清| 久久亚洲欧洲| 国产精品欧美日韩一区二区| 欧美激情精品久久久久久蜜臀| 国产精品亚洲综合天堂夜夜| 欧美二区在线观看| 国产伦精品一区二区三区免费迷 | 狠狠干成人综合网| 在线视频欧美日韩| 亚洲精品国偷自产在线99热| 欧美在线观看视频一区二区三区| 日韩一区二区电影网| 久久久一本精品99久久精品66| 午夜精彩视频在线观看不卡| 欧美丰满高潮xxxx喷水动漫| 久久亚洲欧美| 国产午夜一区二区三区| 在线一区二区三区四区| 亚洲美洲欧洲综合国产一区| 久久精品一区蜜桃臀影院| 午夜精品一区二区三区在线| 欧美日韩亚洲综合在线| 亚洲国产精品成人综合色在线婷婷 | 亚洲高清色综合| 黄色日韩网站视频| 久久精品国产免费| 久久久久久自在自线| 国产丝袜一区二区三区| 亚洲视频国产视频| 欧美亚洲免费电影| 国产精品一区二区在线观看不卡| 在线亚洲国产精品网站| 一个色综合av| 欧美日韩亚洲一区二区三区在线 | 亚洲东热激情| 久久国产99| 欧美精品国产一区二区| 免费在线播放第一区高清av| 国内精品福利| 久久天天躁狠狠躁夜夜爽蜜月| 久久国产免费看| 国产一区清纯| 久久久久九九九九| 欧美大片免费| 夜夜嗨网站十八久久| 欧美日本高清| 国产精品99久久久久久人| 亚洲欧美另类久久久精品2019| 国产精品扒开腿做爽爽爽视频| 国产精品99久久不卡二区| 午夜久久一区| 一区在线影院| 欧美高清在线一区二区| 日韩一区二区精品在线观看| 亚洲欧美日韩高清| 激情综合久久| 欧美成人精品影院| 亚洲天堂av电影| 久久伊人一区二区| 亚洲精品视频在线| 国产精品久久久久国产a级| 欧美在线免费播放| 亚洲国产一区二区精品专区| 9色精品在线| 国产亚洲成人一区| 欧美黄网免费在线观看| 一区二区三区免费在线观看| 欧美一区二区在线免费观看| 亚洲国产一区二区三区在线播| 欧美久久精品午夜青青大伊人| 亚洲午夜精品久久久久久app| 免费成人激情视频| 亚洲一区二区黄| 国产一区二区三区的电影 | 欧美一级淫片aaaaaaa视频| 欧美成人在线免费视频| 亚洲天堂av在线免费| 国内成人精品2018免费看| 欧美v日韩v国产v| 亚洲免费中文| 最新中文字幕一区二区三区| 久久精品国产视频| 欧美日韩高清免费| 久久―日本道色综合久久| 亚洲一区二区影院| 欧美国产亚洲另类动漫| 欧美专区第一页| 亚洲午夜久久久久久久久电影院| 在线观看成人小视频| 国产精品手机在线| 欧美日韩免费高清| 欧美jizzhd精品欧美喷水| 久久精品国产亚洲a| 艳妇臀荡乳欲伦亚洲一区|