• <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>
            隨筆-167  評論-8  文章-0  trackbacks-0

            互聯網發展得很快,都是源自于使用了超文本的表達方式。比如你查看一篇文章,看到不懂的關鍵字,就可以通過鏈接去查看它的內容,看完之后再回來接著看原來的東西,這樣比較適合學習的方式。使用HTML標記的文本,是結構化儲存的,這樣的表達方式才可以實現超級連接。由于HTML具有超強的表達能力,也就在互聯網上生存下來,那么人們就會想到能不能使用這種方式來保存所有需要保存的內容呢?慢慢地就開發XML標記語言,用來保存任意想保存的內容。由于XML具有HTML同樣的功能,并且不限定標記,這樣就可以表達所有的東西了。并且XML是基于樹形結構的,想表達的信息就可以采用歸類樹的方式來組織內容了,這樣能產生靈活可變的內容管理方式。比如在第二人生里采用參數配置文件,也是選擇XML來保存的,并且使用expat的XML解析器來實現這方面的內容。接著下來,我們就來了解一下expat是什么東東,又是怎么樣調用它來解析XML文件的。
             
            expat是使用C編寫的XML解釋器,采用流的方式來解析XML文件,并且基于事件通知型來調用分析到的數據,并不需要把所有XML文件全部加載到內存里,這樣可以分析非常大的XML文件。由于expat庫是由XML的主要負責人James Clark來實現的,因此它是符合W3C的XML標準的。
             
            使用expat庫是非常簡單的,只需要了解四個函數,就可以達到80%的功能了,看來設計這個庫還是比較好的。那么需要了解那四個函數呢?這四個函數如下:
            XML_ParserCreate 創建一個XML分析器。
            XML_SetElementHandler 設置處理標記開始和結束的處理函數。
            XML_SetCharacterDataHandler 設置處理不同字符集的數據。
            XML_Parse 分析給出的緩沖區XML數據。
            通過調用上面四個函數就可以實現expat調用了,使用它就是這么方便簡單的。下一次再帶你來看看怎么樣用它寫一個簡單的例子。

            要了解第二人生里使用expat XML解析器之前,先來仔細地分析一下怎么樣使用expat庫的小例子,看看具體調用了那些接口函數,是否會很復雜的呢?‘它的例子程序如下:
            #001 /*****************************************************************
            #002   * outline.c
            #003   *
            #004   * Copyright 1999, Clark Cooper
            #005   * All rights reserved.
            #006   *
            #007   * This program is free software; you can redistribute it and/or
            #008   * modify it under the same terms as Perl.
            #009   *
            #010   * Read an XML document from standard input and print an element
            #011   * outline on standard output.
            #012   */
            #013
            #014
             
            下面包括輸出文件和庫文件頭。
            #015 #include <stdio.h>
            #016 #include "xmlparse.h"
            #017
             
            定義緩沖區的大小。
            #018 #define BUFFSIZE   8192
            #019
             
            創建一個緩沖區。
            #020 char Buff[BUFFSIZE];
            #021
            #022 int Depth;
            #023
             
            下面定義一個XML元素開始處理的函數。
            #024 void
            #025 start(void *data, const char *el, const char **attr) {
            #026    int i;
            #027
            #028    for (i = 0; i < Depth; i++)
            #029      printf(" ");
            #030
            #031    printf("%s", el);
            #032
            #033    for (i = 0; attr[i]; i += 2) {
            #034      printf(" %s='%s'", attr[i], attr[i + 1]);
            #035    }
            #036
            #037    printf("\n");
            #038    Depth++;
            #039 } /* End of start handler */
            #040
             
            下面定義一個XML元素結束調用的函數。
            #041 void
            #042 end(void *data, const char *el) {
            #043    Depth--;
            #044 } /* End of end handler */
            #045
             
            程序入口點。
            #046 void
            #047 main(int argc, char **argv) {
             
            創建一個XML分析器。
            #048    XML_Parser p = XML_ParserCreate(NULL);
             
            下面判斷是否創建XML分析器失敗。
            #049    if (! p) {
            #050      fprintf(stderr, "Couldn't allocate memory for parser\n");
            #051      exit(-1);
            #052    }
            #053
             
            下面設置每個XML元素出現和結束的處理函數。這里設置start為元素開始處理函數,end元素結束處理函數。
            #054    XML_SetElementHandler(p, start, end);
            #055
             
            循環分析所有XML文件。
            #056    for (;;) {
            #057      int done;
            #058      int len;
            #059
             
            調用函數fread從文件里讀取數據到緩沖區Buff里。
            #060      len = fread(Buff, 1, BUFFSIZE, stdin);
             
            讀取文件出錯就退出。
            #061      if (ferror(stdin)) {
            #062        fprintf(stderr, "Read error\n");
            #063        exit(-1);
            #064      }
             
            判斷是否讀取文件到結束。
            #065      done = feof(stdin);
            #066
             
            調用庫函數XML_Parse來分析緩沖區Buff里的XML數據。
            #067      if (! XML_Parse(p, Buff, len, done)) {
            #068        fprintf(stderr, "Parse error at line %d:\n%s\n",
            #069          XML_GetCurrentLineNumber(p),
            #070          XML_ErrorString(XML_GetErrorCode(p)));
            #071        exit(-1);
            #072      }
            #073
             
            如果分析文件到結尾位置,或者出錯,就可以退出循環處理。
            #074      if (done)
            #075        break;
            #076    }
            #077 } /* End of main */
            #078
            #079
            #080
             
            通過上面調用庫函數XML_ParserCreate、XML_SetElementHandler、XML_Parse等三個函數就完成了XML的分析過程,這樣使用起來真是太簡單了,看到expat庫的威力無窮。
             
            如果需要了解更多關于expat庫的內容,可以參考下面兩個網站:
            http://expat.sourceforge.net/
            http://www.xml.com/pub/a/1999/09/expat/index.html?page=2
             


            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/caimouse/archive/2008/05/19/2459566.aspx

            posted on 2010-06-16 15:02 老馬驛站 閱讀(2763) 評論(0)  編輯 收藏 引用 所屬分類: c++
            久久婷婷色综合一区二区| 久久久久人妻精品一区 | 一本大道久久a久久精品综合| 国产精品毛片久久久久久久 | 精品久久久无码人妻中文字幕豆芽| .精品久久久麻豆国产精品| 国产视频久久| 少妇久久久久久被弄高潮| 99久久精品免费观看国产| 久久久久人妻一区二区三区| 国内精品伊人久久久久AV影院| 精品无码久久久久久国产| 久久ww精品w免费人成| 久久久久久久亚洲精品| 国产精品99久久99久久久| 久久中文字幕视频、最近更新| 久久发布国产伦子伦精品| 香蕉久久永久视频| 久久久精品国产亚洲成人满18免费网站| 国产69精品久久久久APP下载 | 国产一区二区精品久久| 模特私拍国产精品久久| 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品成人免费网站| 伊人久久久AV老熟妇色| 麻豆av久久av盛宴av| 久久亚洲中文字幕精品一区四 | 波多野结衣AV无码久久一区| 国产国产成人久久精品| 国产∨亚洲V天堂无码久久久| av色综合久久天堂av色综合在 | 久久精品嫩草影院| www久久久天天com| 人妻无码久久一区二区三区免费| 亚洲国产成人精品女人久久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 青青草原综合久久大伊人导航| 亚洲综合精品香蕉久久网97| 国产精品久久久天天影视| 一本久久a久久精品综合夜夜 | 天堂久久天堂AV色综合|