程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> EXPAT(XML解析庫),expatxml解析庫

EXPAT(XML解析庫),expatxml解析庫

編輯:關於C語言

EXPAT(XML解析庫),expatxml解析庫


一、簡介

       expat是一個由C語言編寫的XML解析庫。James Clark創建了這個庫,現在是制定XML標准的W3組織的技術leader。現在的版本是2.0。2.0開始就由Clark Cooper領導的開發組在sourceforge.net負責開發。

       expat是一個基於SAX模型的、非驗證(默認,v1.2開始提供驗證接口,需要用戶手動處理)的輕量級XML解釋器。目前XML的解析主要有兩大模型:SAX和DOM。其中SAX(Simple API for XML)是基於事件的解析方法。基本工作原理是分析XML文檔,通過觸發事件來通知用戶解析的結果。這種方式占用內存少,速度快,但用戶程序相應得會比較復雜。而DOM(DocumentObject Model),則是一次性將整個XML文檔進行分析,在內存中以樹結構保存解析結果。同時,向用戶提供一系列的接口來訪問和編輯該樹結構。這種方式占用內存大,速度往往慢於SAX,但可以給用戶提供一個面向對象的訪問接口,對用戶更為友好。

      對於一個特定的XML文檔而言,其正確性分為兩個層次。首先是其格式應該符合XML的基本格式要求,比如第一行要有聲明,標簽的嵌套層次必須前後一致等等,符合這些要求的文件,就是一個合格的XML文件,稱作well-formatted。但除此之外,一個XML文檔因其內容的不同還必須在語義上符合相應的標准,這些標准由相應的DTD文件或者Schema文件來定義,符合了這些定義要求的XML文件,稱作valid。

      因此,解析器也分為驗證和非驗證兩種。是驗證的會跟據XML文件中的聲明,用相應的DTD文件對XML文件進行校驗,檢查它是否滿足DTD文件的要求。非驗證性的則忽略DTD文件,只要基本格式正確,就可以進行解析。常見XML解析庫總結如下:

 

參考:http://www.xml.com/pub/a/1999/09/expat/index.html

 

二、API

http://blog.csdn.net/ymj7150697/article/details/7384126
http://blog.csdn.net/exclusivepig/article/details/4566252

expat-1.2.tar.gz下載

ftp://ftp.jclark.com/pub/xml/

 

三、實例

示例1:example1.c

#include <stdio.h>
#include <stdlib.h>
#include "xmlparse.h"

void startElement (void *userData, const char *name, const char **atts)
{
    int i;
    int *depthPtr = userData;
    for (i = 0; i < *depthPtr; i++)
        printf("\t");
    puts (name);

    for (i = 0; atts[i]; i += 2)
    {
        printf("\t%s='%s'", atts[i], atts[i + 1]);
    }

    printf("\n");
    *depthPtr += 1;
}

void endElement (void *userData, const char *name)
{
    int *depthPtr = userData;
    *depthPtr -= 1;
}

int main (int argc, char *argv[])
{
    char buf[BUFSIZ];
    XML_Parser parser = XML_ParserCreate (NULL);
    int done;
    int depth = 0;
    FILE *fp;

    if (argc != 2)
    {
        printf("Usage: %s filename\n", argv[0]);
        exit(0);

    }
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("Can't open %s\n", argv[1]);
        exit(1);

    }

    XML_SetUserData (parser, &depth);
    XML_SetElementHandler (parser, startElement, endElement);
    do
    {
        size_t len = fread (buf, 1, sizeof (buf), fp);
        // done = len < sizeof(buf);
        done = feof (fp);
        if (!XML_Parse (parser, buf, len, done))
        {
            fprintf (stderr, "%s at line %d\n", XML_ErrorString (XML_GetErrorCode (parser)), XML_GetCurrentLineNumber (parser));
            return 1;
        }
    }
    while (!done);
    XML_ParserFree (parser);
    return 0;
}

編譯

gcc -g -o example1 example1.c -I/root/srcpkg/expat-1.2/xmlparse -L/root/srcpkg/expat-1.2/xmlparse -static -lexpat

運行

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved