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 XML parser相关推荐

  1. php xml expat,PHP Expat :XML的解析器

    本文中,我将讨论任何用PHP内建的Expat解析器来处理XML文档.通过范例,我将演示Expat的处理方法.同时,范例可以告诉你如何: 建立你自己的处理函数 将XML文档转换成你自己的PHP数据结构 ...

  2. 【Java规划】DOM XML Parser分解、遍历、创XML

    1.前言 DOM XML Parser简介 DOM 它是 W3C 处理 XML 规范 API,这是很多其他的 XML 地基处理相关标准,不仅是 Java,其他的,如 Javascript,PHP.MS ...

  3. XML Parser Errors See Details for more Information XML Parser Error on line 1: Document root ele

    1.错误描述 XML Parser ErrorsSee Details for more InformationXML Parser Error on line 1: Document root el ...

  4. repomd.xml parser error:Parse error at line: 14 (xmlParseEntityRef: no name

    华为openEuler(EulerOS)系统 设置yum源 问题描述 在华为openEuler(EulerOS)系统上执行tar命令时候,提示找不到命令 tar: command not found ...

  5. XML Parser(Tinyxml)的使用

    1. 下载开源代码Tinyxml,附件带有. 2. 直接将源码加入到我们的工程中. 3. 包含相应的头文件. 4. 测试代码 Read : TiXmlDocument * myDocument     ...

  6. xml中使用 报错:XML Parser Error on line 35: 在实体引用中, 实体名称必须紧跟在 ‘‘ 后面。

    在实体引用中, 实体名称必须紧跟在 '&' 后面. & 在xml中认定为非法字符.需要修改为: & 再次使用就OK 欢迎大神指导,可以留言交流! =============== ...

  7. 让Expat支持中文XML

    在很多地方看到对一篇<如何让Expat支持中文XML>的文章,其中提到: Expat并不支持中文,Expat不支持gb2312编码格式,主要支持UTF-8编码格式 两种解决办法:     ...

  8. python:xml.parsers.expat --- 使用 Expat 的快速 XML 解析

    python:xml.parsers.expat --- 使用 Expat 的快速 XML 解析 XMLParser对象 ExpatError 异常 示例 内容模型描述 Expat 错误常量 xml. ...

  9. xml解析总结(主分析expat)

    文章目录 1.个人关于解析XML的建议 2.expat安装 3.expat函数介绍 3.1 创建一个XML分析器-----XML_Parser* XML_ParserCreate(const XML_ ...

最新文章

  1. mysql len s.number,mysql内置函数
  2. Microsoft Azure 云存储服务概念
  3. C语言中关于字符串常量的进一步分析 转
  4. WEB-INF目录下登录表单提交的重定向
  5. php round函数输出不对_PHP常量
  6. CMFCColorButton的使用以及重绘
  7. 纸上谈兵:数学归纳法,递归,栈
  8. java arraylist排序_一文读懂Java集合框架
  9. ISO27001认证步骤方法
  10. linux系统商店下载的软件到哪了,linux下使用第三方商店安装应用
  11. 扩展城市信道etu模型matlab仿真,信道估计
  12. mysql 唯一索引为null_mysql 唯一索引与null.md
  13. 《Steve Jobs》
  14. android apk 重新签名工具,安卓apk重新签名教程,快来定制自己的apk吧
  15. 计算机有哪些知识,电脑基本操作知识有哪些
  16. UCI on PUSCH
  17. 硅谷课堂的所有流程图和总结
  18. xiecheng_spider携程民宿爬虫
  19. 阿里云上传图片的使用,AccessKey查看,入门级别
  20. 给你的AppImage创建桌面快捷方式

热门文章

  1. ERP系统对服装行业的帮助有哪些?
  2. 安装配置CentOS
  3. 自动驾驶软件开发人才现状_新技术改变传统出行方式 多国自动驾驶行业现状及人才需求分析...
  4. 十进制数转换为二进制,八进制,十六进制数的算法(欢迎拍砖)
  5. 你去过(gan)大(huo)年(che),Down机别烦我
  6. Linux下常用的编辑文件与保存命令
  7. Linux命令之查看行号
  8. Linux 网络适配,ping命令,更改自己的IP地址
  9. Web服务器python编程
  10. 盘点百度搜索算法大全(2022最新版)