<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    知新軒
    溫故而知新,可以為師矣.
    posts - 7,  comments - 2,  trackbacks - 0

    1,編碼時需要包括頭文件:#include <libxml/globals.h>,編譯時需要鏈接 -lxml2 -lwsock32 的庫文件.
    2,xmlexports.h需要修改部分代碼才可以被正常連接,否則使用xmlfree函數(shù)時會報"_imp__xmlFree"的鏈接錯誤.
       修改代碼如下:
       將 #if defined(_WIN32) && defined(__MINGW32__) 代碼段,包括:
       #if defined(_WIN32) && defined(__MINGW32__)
      #undef XMLPUBFUN
      #undef XMLPUBVAR
      #undef XMLCALL
      #if defined(IN_LIBXML) && !defined(LIBXML_STATIC)
        #define XMLPUBFUN __declspec(dllexport)
        #define XMLPUBVAR __declspec(dllexport)
      #else
        #define XMLPUBFUN
        #if !defined(LIBXML_STATIC)
          #define XMLPUBVAR __declspec(dllimport) extern
        #else
          #define XMLPUBVAR extern
        #endif
      #endif
      #define XMLCALL __cdecl
      #if !defined _REENTRANT
        #define _REENTRANT
      #endif
    #endif
    注釋掉,然后在原有位置添上:
    #if defined(_WIN32) && defined(__MINGW32__)
       #define XMLPUBFUN
       #ifdef __cplusplus
         #define XMLPUBVAR extern
       #else
         #define XMLPUBVAR
       #endif
       #if !defined _REENTRANT
         #define _REENTRANT
       #endif
    #endif
       具體原因及詳細信信息    <?xml version="1.0" encoding="UTF-8"?>
       <NodeRoot ver = "000">
          <Node1 ver = "111">
                <Node2 ver = "222"/>
           </Node1>
           <Node3 ver = "333">
                 v3
           <Node3/>
       </NodeRoot>
       "
       首先,打開xml文件,使用:
       XMLPUBFUN xmlDocPtr XMLCALL   xmlParseFile  (const char *filename); (libxml/parser.h)
       獲得xml的根節(jié)點,使用:
       XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement (xmlDocPtr doc);(libxml/tree.h)
       
       例:
      int ParseXMLFile(char *pXMLFileName)
       // retval:
       // 0 : Success
       // -1: Error ,for xml file open
       // -2: Error ,for xml file parse
       {
           int retval = 0;
           xmlDocPtr doc = NULL;
           xmlNodePtr cur = NULL;

           doc = xmlParseFile(pXMLFileName);
           if (doc == NULL ) 
           {
                 fprintf(stderr,"XMLParser:Document not parsed successfully. \n");
                 retval = -1;
                 goto ERROR_RET;
           }
           cur = xmlDocGetRootElement(doc);         // 會得到NodeRoot 節(jié)點.
           if (cur == NULL) 
           {
                 fprintf(stderr,"XMLParser:Empty document.\n");
                 retval = -2;
                 goto ERROR_RET;
           }


           //     ...  do something
           parsexml(doc,cur);         // 定義見下面.


        ERROR_RET:
           if(doc != NULL)
               xmlFreeDoc(doc);
           return retval;
        }
       其中,:
       結(jié)構(gòu)xmlNodePtr 定義如下(libxml/tree.h):
        typedef struct _xmlNode xmlNode;
        typedef xmlNode *xmlNodePtr;
        struct _xmlNode {
        void           *_private; /* application data */
        xmlElementType   type; /* type number, must be second ! */
        const xmlChar   *name;      /* the name of the node, or the entity */ 
        struct _xmlNode *children; /* parent->childs link */
        struct _xmlNode *last; /* last child link */
        struct _xmlNode *parent; /* child->parent link */
        struct _xmlNode *next; /* next sibling link  */
        struct _xmlNode *prev; /* previous sibling link  */
        struct _xmlDoc  *doc; /* the containing document */

        /* End of common part */
        xmlNs           *ns;        /* pointer to the associated namespace */
        xmlChar         *content;   /* the content */
        struct _xmlAttr *properties;/* properties list */
        xmlNs           *nsDef;     /* namespace definitions on this node */
        void            *psvi; /* for type/PSVI informations */
        unsigned short   line; /* line number */
        unsigned short   extra; /* extra data for XPath/XSLT */
        };
        我們可以使用節(jié)點結(jié)構(gòu)中的指針成員來遍歷xml樹中的各個節(jié)點.
        我一般使用遞歸的方式遍歷xml樹:
       int parsexml(xmlDocPtr doc, xmlNodePtr cur)
       {
           while (cur != NULL)
           {
              // do something about every node
               printf("name: %s\n",cur->name);
              {
                    //  for example,we get the "ver" attribute of every node
                    xmlChar *uri = NULL; 
                    uri = xmlGetProp(cur,(const xmlChar *) "ver"); 
                    if(uri != NULL)
                    {
                      printf("ver: %s\n", uri);
                       xmlFree(uri);
                    }
                    ;   // ... others

                 }
        
                 parsexml(doc,cur->xmlChildrenNode);
                 cur = cur->next;
              }
              return 0;
          }
         對于我們已經(jīng)獲取的結(jié)點,我們可以使用以下函數(shù)獲取其各項屬性各項屬性:
          XMLPUBFUN xmlChar * XMLCALL xmlGetProp  (xmlNodePtr node,const xmlChar *name); (libxml/tree.h)
          獲得該節(jié)點的某項屬性,其中,屬性名稱使用 第二個參數(shù)name指定,第一個參數(shù)需要傳入結(jié)點指針.
          屬性的值通過函數(shù)返回傳出,返回類型是 xmlChar,這里注意,返回的地址是指向堆的,這意味著你需要
          在使用完畢后,手動釋放這塊內(nèi)存.這里使用xmlfree函數(shù),并將指針傳入即可.
          
          
          更多函數(shù)參見 libxml/tree.h

          最后,你需要調(diào)用xmlFreeDoc函數(shù)進行必要的釋放工作.
          
          完整代碼:
          
    http://m.tkk7.com/Files/lixf/testlibxml.rar
          
      
       

    posted on 2005-12-07 11:40 ___ 閱讀(1464) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     

    <2005年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆檔案(6)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚美影视免费在线观看| 成人a免费α片在线视频网站| 区三区激情福利综合中文字幕在线一区亚洲视频1 | h视频在线免费观看| 国产免费69成人精品视频| 日本亚洲色大成网站www久久 | 色偷偷亚洲第一综合网| 一个人免费观看www视频在线| 亚洲午夜视频在线观看| 免费无码黄网站在线看| 久久精品国产精品亚洲人人 | 污视频在线观看免费| 亚洲人成精品久久久久| 精品无码一级毛片免费视频观看| 免费a在线观看播放| 精品亚洲视频在线| 国产成人无码a区在线观看视频免费 | 2022中文字字幕久亚洲| 一级做a爰片久久毛片免费陪 | 国产偷国产偷亚洲高清人| 免费看的一级毛片| 亚洲午夜成人精品无码色欲| 黄页网站免费观看| 亚洲同性男gay网站在线观看| 1000部无遮挡拍拍拍免费视频观看| 午夜亚洲AV日韩AV无码大全| 久久免费国产视频| 无码乱人伦一区二区亚洲一| 99久久久国产精品免费牛牛四川| 久久精品国产亚洲AV麻豆不卡| 国产情侣久久久久aⅴ免费 | 亚洲无人区码一二三码区别图片 | 一级免费黄色大片| 国产av无码专区亚洲国产精品| eeuss草民免费| 中文字幕亚洲综合久久菠萝蜜 | 亚洲美女自拍视频| 国产成人免费在线| 亚洲日本香蕉视频| 欧洲黑大粗无码免费| 亚洲欧美aⅴ在线资源|