<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://www.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)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产VA免费精品高清在线| 亚洲成av人片在www鸭子| 伊人久久大香线蕉免费视频| 免费观看国产精品| 黄色毛片免费观看| 国产亚洲精品无码专区| 黄色网址免费在线观看| 国产亚洲精久久久久久无码| 天黑黑影院在线观看视频高清免费| 亚洲欧洲国产精品香蕉网| 久久免费精品视频| 亚洲视频国产视频| 西西大胆无码视频免费| 亚洲一日韩欧美中文字幕在线| 成年美女黄网站色大免费视频| 亚洲av成人一区二区三区在线播放| 国产免费观看青青草原网站| 阿v免费在线观看| 亚洲色欲久久久综合网东京热| 国内精品免费在线观看 | www一区二区www免费| 亚洲人成伊人成综合网久久久| 久久成人a毛片免费观看网站| 精品亚洲成a人片在线观看少妇| 精品免费久久久久久久| 亚洲另类无码专区首页| 精品亚洲一区二区三区在线观看 | 亚洲资源在线观看| 青苹果乐园免费高清在线| 亚洲а∨精品天堂在线| 久久久久国产成人精品亚洲午夜 | 全黄大全大色全免费大片| 337p欧洲亚洲大胆艺术| 天天看免费高清影视| 一个人看www免费高清字幕| 亚洲伦另类中文字幕| 成人毛片免费在线观看| 国产在线播放线91免费| 亚洲人成www在线播放| 亚洲女同成人AⅤ人片在线观看 | 亚洲人成网站18禁止久久影院|