一、簡介
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
運行