• <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 老馬驛站 閱讀(2756) 評論(0)  編輯 收藏 引用 所屬分類: c++
            久久中文精品无码中文字幕| 嫩草影院久久国产精品| 久久精品国产亚洲AV无码麻豆| 性欧美大战久久久久久久| 亚洲人AV永久一区二区三区久久 | 99精品久久精品| 国产激情久久久久影院小草| 久久免费99精品国产自在现线| 麻豆av久久av盛宴av| 欧美久久综合性欧美| 久久这里有精品| 国产精品一区二区久久精品无码 | 国产亚洲精久久久久久无码AV| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久天天躁狠狠躁夜夜不卡| 中文字幕日本人妻久久久免费 | 久久久久亚洲AV成人网| 久久影院综合精品| 久久综合久久性久99毛片| 久久国产乱子伦精品免费强| 国产一区二区久久久| 国产亚洲欧美成人久久片| 亚洲va久久久噜噜噜久久狠狠 | 久久精品国产亚洲一区二区三区 | 91麻豆国产精品91久久久| 精品国产91久久久久久久a| 国产精品无码久久久久久| 国产成人精品综合久久久久| 久久久国产精品| 久久国产成人午夜aⅴ影院| 九九99精品久久久久久| 久久亚洲精精品中文字幕| 人妻精品久久无码区| 无遮挡粉嫩小泬久久久久久久| 国内精品久久久久影院老司| 久久久久久国产a免费观看黄色大片 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 亚洲欧美成人久久综合中文网| 久久精品亚洲男人的天堂| 久久综合给合综合久久| 亚洲第一永久AV网站久久精品男人的天堂AV |