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

          1,編碼時(shí)需要包括頭文件:#include <libxml/globals.h>,編譯時(shí)需要鏈接 -lxml2 -lwsock32 的庫(kù)文件.
          2,xmlexports.h需要修改部分代碼才可以被正常連接,否則使用xmlfree函數(shù)時(shí)會(huì)報(bào)"_imp__xmlFree"的鏈接錯(cuò)誤.
             修改代碼如下:
             將 #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
             具體原因及詳細(xì)信信息    <?xml version="1.0" encoding="UTF-8"?>
             <NodeRoot ver = "000">
                <Node1 ver = "111">
                      <Node2 ver = "222"/>
                 </Node1>
                 <Node3 ver = "333">
                       v3
                 <Node3/>
             </NodeRoot>
             "
             首先,打開(kāi)xml文件,使用:
             XMLPUBFUN xmlDocPtr XMLCALL   xmlParseFile  (const char *filename); (libxml/parser.h)
             獲得xml的根節(jié)點(diǎn),使用:
             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);         // 會(huì)得到NodeRoot 節(jié)點(diǎn).
                 if (cur == NULL) 
                 {
                       fprintf(stderr,"XMLParser:Empty document.\n");
                       retval = -2;
                       goto ERROR_RET;
                 }


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


              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é)點(diǎn)結(jié)構(gòu)中的指針成員來(lái)遍歷xml樹(shù)中的各個(gè)節(jié)點(diǎn).
              我一般使用遞歸的方式遍歷xml樹(shù):
             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;
                }
               對(duì)于我們已經(jīng)獲取的結(jié)點(diǎn),我們可以使用以下函數(shù)獲取其各項(xiàng)屬性各項(xiàng)屬性:
                XMLPUBFUN xmlChar * XMLCALL xmlGetProp  (xmlNodePtr node,const xmlChar *name); (libxml/tree.h)
                獲得該節(jié)點(diǎn)的某項(xiàng)屬性,其中,屬性名稱使用 第二個(gè)參數(shù)name指定,第一個(gè)參數(shù)需要傳入結(jié)點(diǎn)指針.
                屬性的值通過(guò)函數(shù)返回傳出,返回類型是 xmlChar,這里注意,返回的地址是指向堆的,這意味著你需要
                在使用完畢后,手動(dòng)釋放這塊內(nèi)存.這里使用xmlfree函數(shù),并將指針傳入即可.
                
                
                更多函數(shù)參見(jiàn) libxml/tree.h

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

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

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


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

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

          常用鏈接

          留言簿(1)

          隨筆檔案(6)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 定日县| 永仁县| 苗栗县| 崇文区| 醴陵市| 望谟县| 西盟| 若羌县| 凤冈县| 即墨市| 尤溪县| 东港市| 正宁县| 临朐县| 昌邑市| 南郑县| 金乡县| 宁波市| 岐山县| 永济市| 池州市| 保亭| 四平市| 桐柏县| 英吉沙县| 长岭县| 樟树市| 宜城市| 武汉市| 荥经县| 汾西县| 深泽县| 阿拉善右旗| 保山市| 松滋市| 泗阳县| 大荔县| 桂林市| 台安县| 罗甸县| 利辛县|