知新軒
          溫故而知新,可以為師矣.
          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.aygfsteel.com/Files/lixf/testlibxml.rar
                
            
             

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

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


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

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

          常用鏈接

          留言簿(1)

          隨筆檔案(6)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南城县| 兴仁县| 司法| 山阳县| 锡林浩特市| 山东省| 漳州市| 鄂伦春自治旗| 秭归县| 苍溪县| 恩施市| 株洲县| 清水河县| 广河县| 玉林市| 洪泽县| 云林县| 南漳县| 延边| 广饶县| 黄龙县| 泰来县| 大悟县| 聂拉木县| 鄂尔多斯市| 疏附县| 石林| 海淀区| 务川| 平谷区| 富锦市| 稷山县| 溧水县| 吕梁市| 武川县| 日土县| 兴业县| 苍南县| 刚察县| 桂东县| 藁城市|