没有合适的资源?快使用搜索试试~ 我知道了~
开源xml解析器.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 109 浏览量
2022-06-26
09:48:13
上传
评论
收藏 256KB DOC 举报
温馨提示
试读
46页
开源xml解析器.doc
资源推荐
资源详情
资源评论
Expat 是什么?
是一个用 语言开发的、用来解析 文档的开发库,它最初是开源的、
项目下的一个 解析器。
关于作者
这个库的开发者是 , 还开发了很多我们所熟知的工具包: 、
、 、 。
Expat XML Parser 概述
是一个面向流的解析器。您注册的解析器回调(或 )功能,然后
开始搜索它的文档。当解析器识别该文件的指定的位置,它会调用该部分相应的处理程
序(如果您已经注册的一个)。该文件被输送到解析器,会被分割成多个片断,并分段
装到内存中。因此 可以解析那些巨大的文件。
如何使用它们
支持设置多种不同的处理器。但是要使用它们,你只需要学
习四个功能,即可满足 !"#的需要。 它们是:
XML_ParserCreate$%&'
XML_SetElementHandler ('
XML_SetCharacterDataHandler ('
XML_Parse%)()()
开源的
XML Parser expat
文章分类:C++ 编程
是使用 所写的 解释器,采用流的方式来解析 文件,并且基于事件
通知型来调用分析到的数据,并不需要把所有 文件全部加载到内存里,这样可以分析
非常大的 文件。由于 库是由 的主要负责人 来实现的,因
此它是符合 *+ 的 标准的。
正因为源码全部是纯 所写,因此,非常容易移植,尤其是适用于嵌入式平台,我在往
联芯的手机平台上移植时,几乎没改任何东西。
不过,优点也带来了缺点,因为是采用流的方式解析 ,所以不会像 , 那样
在一块内存中生成基于 -. 的树。 虽然这样解析起来略显麻烦,但是基于回调的机制,
在我看来还是蛮方便的。下面就说使用方法:
首先是用 // 01,参数一般为
12,函数返回一个 / 类型指针,我们就当他是一个句柄吧,类似于
*$ 里的内核对象,一般需要保存在一个全局的指针里。
然后调用 /3/4
55555555555555555555555555555/34
55555555555555555555555555555/3
第一个参数是那个 句柄,第二个和第三个参数则是整个 的核心,类型
为 6 的函数,不了解 6 函数的,我在这里简单说下,函数调用一般
分为两种,一种是主调,即编写代码者自己调用的函数,还一种称为 % 函数,
编码者写好,但他自己却不主动调用,而是在某些条件下(编码者并不清楚具体时间
和流程),由其他函数调用,比如设备驱动,操作系统提供了一组某个设备的函数指
针,比如 - 屏驱动,由一组画点,画线,画块等函数组成,当更换 - 时,只需
要把操作系统开放的函数指针,指向你提供的接口即可,操作系统再需要时,会自动
调用你的驱动函数,这就是回调函数一个典型的例子。
这二个回调分别是对应于解析78和798, 下面分别详细介绍这个 : 个回调函数。
,(;0/3
0)-4
/ 04
/ 00<
其中第一个参数 )-4可以由函数
/2-/40
设置,参数就不用说了吧? 后面两个参数,我用个具体的列子说明下,这样更好理
解: 比如有个标准 ,某个标签属性如下:
7(=>:'">?=>@:A:>?=>()>(?
,=>(>8
那么 3 回调返回的 就是标签>(>400 是一个指针
数组,分别指向标签的一组属性,B"C就是>>4BAC就是>:'">4以此类
推。应该很清楚了吧?呵呵。
这时候必然有个对应的79(8:
5,(;0/3
0)-4
/ 0<
就是处理标签结束的, 就是>(D了,这个回调一般是用户设置自己的状态机
的。最后一个函数就是
/ -3
/4
/ -3
这个函数是设置处理一个78和798之间的字段的回调。回调原型如下:
,(;0/ -3
0)-4
/ 04
<
其中第二个参数是一块 6) 的指针,如果你单步 -62E 后,你会发现 用
的就是你传入的那块 6)这块 6) 下面讲解),比如:
78天气798
7),8:! 日 "! 时至 :@ 日 "! 时,陕西中南部、山西西南部、河南中
南部、湖北北部、四川中东部、重庆西部和北部、贵州西部等地的部分地区有
大雨或暴雨,河南南部、湖北北部等地局部有大暴雨。【点击“更多”查询其他
城市天气】79),8
假设目前解析到天气这个 -4如果你看那个指针的所有内容的话,实际上是这样的:
555555天气798
5555557),8:! 日 "! 时至 :@ 日 "! 时,陕西中南部、山西西南部、河南中南部、
湖北北部、四川中东部、重庆西部和北部、贵州西部等地的部分地区有大雨或暴雨,河南
南部、湖北北部等地局部有大暴雨。【点击“更多”查询其他城市天气】79),8
所以要根据第三个参数 来确定正确的数据。
555但这里有个非常隐晦的问题,如果不知道的话,会带来很大麻烦,下面说。
最后就是 ,调用
XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
第二个参数是用户指定的 6) 指针, 第三个是这块 6) 中实际内容的字节数,最后
参数代表是否这块 6) 已经结束。比如要解析的 文件太大,但内存比较吃紧,
6) 比较小,则可以循环读取文件,然后丢给 , 在文件读取结束前,F
参数为 F;,反之为 G2。
555这里的 6) 如果太小则会造成上面提到那个隐晦的问题,
555/ -3 一次返回的可能并不是完整的 -4比如这个
- 的 大于你的 6) 大小,那这是会连续调用 : 次
/ -34我们需要将 : 次结果拼接起来,以得到正确结果,因此我
们的状态机一定要考虑到这点。 顺便说下
XML_ParserReset(XML_Parser parser, const XML_Char
*encodingName)函数,在某些时候,如果你不确定前后 : 次 是否一样的情况下,
比如网络上投递的 ,在一次解析后最好调用一次本函数,否则会出现意料之外的结果。
比如前后两次 完全一样,可这你并不知情,那么 /()会返回失败。
XML 解析-libxml 库函数解释
libxml(一)
绪论
% 是一个实现读、创建及操纵 数据功能的 语言库。这个指南提供例子代
码并给出它基本功能的解释。在这个项目的主页上有 % 及更多关于它可用的资料。
包含有完整的 ;H 文档。这个指南并不能替代这些完整的文档,但是阐明功能需要使用库
来完成基本操作。
这个指南基于一个简单的 应用,它使用我写的一篇文章生成,它包含有元数据和文
章的主体。
本指南中的例子代码示范如何做到:
I解析文档
I取得指定元素的文本
I添加一个元素及它的内容
I添加一个属性
I取得一个属性的值
例子的完整代码包含在附录中
数据类型
% 定义了许多数据类型,我们将反复碰到它们,它隐藏了杂乱的来源以致你不必
处理它除非你有特定的需要。xmlChar 替代 4使用 2F?! 编码的一字节字符串。如
果你的数据使用其它编码,它必须被转换到 2F?! 才能使用 % 的函数。在 % 编
码支持 *6 页面有更多关于编码的有用信息。
- 包含由解析文档建立的树结构,xmlDocPtr 是指向这个结构的指针。
xmlNodePtr1 包含单一结点的结构 1 是指向这个结构的
指针,它被用于遍历文档树。
解析文档
解析文档时仅仅需要文件名并只调用一个函数,并有错误检查。完整代码:附录 4
J,$ 例程代码
K-<
L1)<
M=F<
N(==12O
((4>-))(),'P><
)<
Q
R)=xmlDocGetRootElement(doc)<
S()==12O
((4>,)P><
F-<
)<
Q
T()?84 0>,>O
((4>)( $,4U=,><
F-<
)<
Q
K 定义解析文档指针。
L 定义结点指针你需要它为了在各个结点间移动。
N 检查解析文档是否成功,如果不成功,% 将指一个注册的错误并停止。
注释
一个常见错误是不适当的编码。 标准文档除了用 2F?! 或 2F?AV 外还可用其它编
码保存。如果文档是这样,% 将自动地为你转换到 2F?!。更多关于 编码信息
包含在 标准中。
R 取得文档根元素
S 检查确认当前文档中包含内容。
T 在这个例子中,我们需要确认文档是正确的类型。“,D是在这个指南中使用文档的
根类型。
取得元素内容
你找到在文档树中你要查找的元素后可以取得它的内容。在这个例子中我们查找
“,D元素。进程将在冗长的树中查找我们感兴趣的元素。我们假定你已经有了一个名为
的 - 和一个名为 ) 的 1。
K)=)?8 1<
②while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
parseStory (doc, cur);
}
cur = cur->next;
}
K 取得 ) 的第一个子结点,) 指向文档的根,即“,D元素。
L 这个循环迭代通过“,D的子元素查找“,(D。这是一个包含有我们将查找的
“,$D的元素。它使用了 % 字符串比较函数 。如果相符,它调用
函数 ,。
,-41)O
0,<
K)=)?8 1<
L$ )U=12O
(U)?84 0>,$>O
M,= xmlNodeListGetString4)?8 14A<
(>,$W#P>4,<
xmlFree(key)<
Q
)=)?8<
Q
)<
Q
K再次取得第一个子结点。
剩余45页未读,继续阅读
资源评论
智慧安全方案
- 粉丝: 3650
- 资源: 59万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于SHT25温湿度传感器、FREERTOS、STM32F103C8T6、LCD1602温湿度采集显示系统proteus仿真设计
- C# 屏幕放大取色器 随时随地获取屏幕像素颜色
- 下载安装这个软件.apk
- 【数据集详细解释及案例分析】数据集详细解释及案例分析
- 基于SHT71温湿度传感器、STM32F103C8T6、LCD1602温湿度采集显示系统proteus仿真设计
- 基于TH02温湿度传感器、STM32F103C8T6、LCD1602、FREERTOS的温湿度采集系统proteus仿真设计
- 【TCP-IP协议详细解释及案例分析】TCP-IP协议详细解释及案例分析
- 一文搞懂 LSTM(长短期记忆网络).rar
- 【autosar简介及基本案例解析】autosar简介及基本案例解析
- java模拟斗地主洗牌发牌
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功