




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档 1欢迎下载 1 1 编写说明编写说明 本文档主要介绍 XML 的基本知识及利用如何利用 libxml 来操作 xml 文件 2 2 XMLXML 基础基础 XML Extensible Markup Language 即可扩展标记语言 它与 HTML 一样 都是 SGML Standard Generalized Markup Language 标准通用标记语言 Xml 是 Internet 环境中跨平台的 依赖于内 容的技术 是当前处理结构化文档信息的有力工具 扩展标记语言 XML 是一种简单的数据存储语言 使用一系列简单的标记描述数据 而这些标记可以用方便的方式建立 XML 中共有 12 种节点类型 其中最常见的节点类型有 5 种 元素 元素是 XML 的基本组成单元 描述 XML 的基本信息 属性 属性节点包含关于元素节点的信息 通常包含在元素里面 描述元素的属性 文本 包含许多文本信息或者只是空白 文档 文档节点是整个文档中所有其它节点的父节点 注释 注释是对相关的信息进行描述 注释 xml 的解析一般都是用 j2se 提供的 API 来解析 在 linux 下有两种方法来解析 一个是 DOM document object Model 文档对象模型法 还有就是简单 API simple API for XML SAX DOM 中的核心概念就是节点 DOM 在分析 XML 文档时 将将组成 XML 文档的各个部分 元素 属性 文本 注释 处理指令等 映射为一个对象 节点 在内存中 这些节点形成一课文档树 整棵树是 一个节点 树中的每一个节点也是一棵树 子树 可以说 DOM 就是对这棵树的一个对象描述 我 们通过访问树中的节点来存取 XML 文档的内容 SAX 是一种基于事件驱动的 API 利用 SAX 解析 XML 文档 牵涉到两个部分 解析器和事件处理器 解析器负责读取 XML 文档 并向事件处理器发生事件 如元素开始和元素结束事件 而事件处理器 精品文档 2欢迎下载 则负责对事件做出响应 对传递的 XML 数据进行处理 DOM 虽然是 W3C 的标准 提供了标准的解析方式 但它的解析效率一直不尽如人意 因为使用 DOM 解析 XML 时 解析器读入整个文档并构建一个驻留内存的树结构 节点树 然后您的代码才可以 使用 DOM 的标准接口来操作这个树结构 但大部分情况下我们只对文档的部分内容感兴趣 根本就 不用先解析整个文档 并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的 相比于 文档对象模型 DOM SAX 是读取和操作 XML 数据的更快速 更轻量的方法 SAX 允许您在读取文档 时处理它 从而不必等待整个文档被存储之后才采取操作 它不涉及 DOM 所必需的开销和概念跳跃 SAX API 是一个基于事件的 API 适用于处理数据流 即随着数据的流动而依次处理数据 SAX API 在其解析您的文档时发生一定事件的时候会通知您 在您对其响应时 您不作保存的数据将会 被抛弃 SAX 不必事先将整个 XML 文档加载到内存中 因此它占据内存要比 DOM 小 对于大型的 XML 文档来说 通常会使用 SAX 而不是 DOM 进行解析 3 3 LibXmlLibXml 介绍介绍 需求安装包 libxml2 和 libxm2 devel 其中 libxml 主要包括 so 文件 libxml2 devel 包括开发 文档和所有的 h 文件 Linux 下可用 rpm ql 命令查看 rpm qd 可查看文档信息 3 13 1 数据类型 数据类型 xmlCharxmlChar 在 libXml 中用 xmlCha 替代 char XML 使用 UTF 8 编码的一字节字符串 如果你的数据使用其它编 码 它必须被转换到 UTF 8 才能使用 libxml 的函数 转码函数需用到 libiconv 库中的 ConvertEncoding 函数 如同标准 c 中的 char 类型一样 xmlChar 也有动态内存分配 字符串操作等相关函数 例如 xmlMalloc 是动态分配内存的函数 xmlFree 是配套的释放内存函数等等 基本上动态内存分配函数 xmlmemory h 中定义 而为了方便对 xmlChar 类型字符串的操作 libxml 提供了自己的函数 它们的 定义于标准 c 函数库中的字符串函数很像 xmlChar 字符串相关函数都在 xmlstring h 中定义 xmlChar xmlStrcat xmlChar cur const xmlChar add const xmlChar xmlStrchr const xmlChar str xmlChar val 精品文档 3欢迎下载 int xmlStrcmp const xmlChar str1 const xmlChar str2 int xmlStrlen const xmlChar str xmlChar xmlStrncat xmlChar cur const xmlChar add int len int xmlStrncmp const xmlChar str1 const xmlChar str2 int len const xmlChar xmlStrstr const xmlChar str const xmlChar val 另外要注意 因为总是要在 xmlChar 和 char 之间进行类型转换 所以定义了一个宏 BAD CAST 其 定义如下 xmlstring h define BAD CAST xmlChar 原则上来说 unsigned char 和 char 之间进行强制类型转换是没有问题的 3 23 2 DODOM M 对象模型解析简介对象模型解析简介 3 2 13 2 1 重要数据结构重要数据结构 XmlDoc 代表 DOM 结构中的文档类型 包含由解析文档建立的树结构 xmlDocPtr 是指向这个结构 的指针 xmlNode 代表 DOM 结构中的除文档类型类型外的其它节点类型 包含单一结点的结构 xmlNodePtr 是指向这个结构的指针 它被用于遍历文档树 节点应该是 xml 中最重要的元素了 xmlNode 代表 了 xml 文档中的一个节点 实现为一个 struct 内容很丰富 tree h typedef struct xmlNode xmlNode typedef xmlNode xmlNodePtr struct xmlNode void private xmlElementType type const xmlChar name struct xmlNode children 精品文档 4欢迎下载 struct xmlNode last struct xmlNode parent struct xmlNode next struct xmlNode prev struct xmlDoc doc xmlNs ns xmlChar content struct xmlAttr properties xmlNs nsDef void psvi unsigned short line unsigned short extra 可以看到 节点之间是以链表和树两种方式同时组织起来的 next 和 prev 指针可以组成链表 而 parent 和 children 可以组织为树 所有节点都是文档 XmlDoc 节点的直接或间接子节点 同时还有 以下重要元素 节点中的文字内容 节点中的文字内容 contentcontent 节点所属文档 节点所属文档 docdoc 节点名字 节点名字 namename 节点的节点的 namespacenamespace nsns 节点属性列表 节点属性列表 propertiesproperties Xml 文档的操作其根本原理就是在节点之间移动 查询节点的各项信息 并进行增加 删除 修改 的操作 xmlDocSetRootElement 函数可以将一个节点设置为某个文档的根节点 这是将文档与节点 连接起来的重要手段 当有了根结点以后 所有子节点就可以依次连接上根节点 从而组织成为一 个 xml 树 3 2 23 2 2 创建创建 XMLXML 文档文档 精品文档 5欢迎下载 创建一个创建一个 xmlxml 文档流程如下 文档流程如下 l 用 xmlNewDoc 函数创建一个文档指针 doc l 用 xmlNewNode 函数创建一个节点指针 root node l 用 xmlDocSetRootElement 将 root node 设置为 doc 的根结点 l 给 root node 添加一系列的子节点 并设置子节点的内容和属性 l 用 xmlSaveFile 将 xml 文档存入文件 l 用 xmlFreeDoc 函数关闭文档指针 并清除本文档中所有节点动态申请的内存 示例代码 示例代码 include include include int main int argc char argv xmlDocPtr pdoc NULL xmlNodePtr proot node NULL pnode NULL pnode1 NULL 创造一个新文档并设置要 root 节点 在 XML 文档中有且只有一个 root 节点 精品文档 6欢迎下载 pdoc xmlNewDoc BAD CAST 1 0 proot node xmlNewNode NULL BAD CAST plist xmlNewProp proot node BAD CAST version BAD CAST 1 0 xmlDocSetRootElement pdoc proot node pnode xmlNewNode NULL BAD CAST dict 创造 root 节点的子节点 xmlNewChild pnode NULL BAD CAST key BAD CAST info pnode1 xmlNewNode NULL BAD CAST dict 保存文档 xmlSaveFormatFileEnc argc 1 argv 1 pdoc UTF 8 1 释放文档指针 xmlFreeDoc pdoc xmlCleanupParser xmlMemoryDump debug memory for regression tests return 0 精品文档 7欢迎下载 涉及相关函数 涉及相关函数 xmlNewDoc xmlNewNode xmlDocSetRootElement xmlSaveFile xmlFreeDoc 3 2 33 2 3 解释文档解释文档 解析一个 xml 文档 从中取出想要的信息 例如节点中包含的文字 或者某个节点的属性 其流程 如下 l 用 xmlReadFile 函数读出一个文档指针 doc l 用 xmlDocGetRootElement 函数得到根节点 curNode l curNode xmlChildrenNode 就是根节点的子节点集合 l 轮询子节点集合 找到所需的节点 用 xmlNodeGetContent 取出其内容 l 用 xmlHasProp 查找含有某个属性的节点 l 取出该节点的属性集合 用 xmlGetProp 取出其属性值 l 用 xmlFreeDoc 函数关闭文档指针 并清除本文档中所有节点动态申请的内存 注意 节点列表的指针依然是注意 节点列表的指针依然是 xmlNodePtrxmlNodePtr 属性列表的指针也是 属性列表的指针也是 xmlAttrPtrxmlAttrPtr 并没有 并没有 xmlNodeListxmlNodeList 或者或者 xmlAttrListxmlAttrList 这样的类型 看作列表的时候使用它们的这样的类型 看作列表的时候使用它们的 nextnext 和和 prevprev 链表指针来进行轮询 只链表指针来进行轮询 只 有在有在 XpathXpath 中有中有 xmlNodeSetxmlNodeSet 这种类型 其使用方法前面已经介绍了 这种类型 其使用方法前面已经介绍了 精品文档 8欢迎下载 示例代码 int main int argc char argv xmlDocPtr pdoc NULL xmlNodePtr proot NULL pcurnode NULL char psfilename if argc name BAD CAST plist 0 printf error document exit 1 if xmlHasProp pcurnode BAD CAST version xmlChar szAttr xmlGetProp pcurnode BAD CAST version printf get version s n szAttr xmlFreeDoc pdoc 精品文档 10欢迎下载 xmlCleanupParser return 0 涉及函数 涉及函数 xmlParseFile xmlReadFile xmlDocGetRootElement xmlHasProp xmlGetPr op 其中 xmlParseFile 和 xmlReadFile 都具备打开 XML 文件的功能 xmlParseFile 函数以默认方式读入一个 UTF 8 格式的文档 并返回文档指针 xmlReadFile 函数读入一个带有某种编码的 xml 文档 并返回文档指针 3 2 43 2 4 修改修改 XMLXML 有了上面的基础 修改 xml 文档的内容就很简单了 首先打开一个已经存在的 xml 文档 顺着根结点找到需要添加 删除 修改的地方 调用相应的 xml 函 数对节点进行增 删 改操作 示例代码 include int main int argc char argv xmlDocPtr doc 定义解析文档指针 精品文档 11欢迎下载 xmlNodePtr curNode 定义结点指针 你需要它为了在各个结点间移 动 char szDocName if argc children while NULL curNode 删除 newNode1 if xmlStrcmp curNode name BAD CAST newNode1 xmlNodePtr tempNode tempNode curNode next xmlUnlinkNode curNode xmlFreeNode curNode curNode tempNode continue 精品文档 13欢迎下载 修改 node2 的属性值 if xmlStrcmp curNode name BAD CAST node2 xmlSetProp curNode BAD CAST attribute BAD CAST no 修改 newNode2 的内容 if xmlStrcmp curNode name BAD CAST newNode2 xmlNodeSetContent curNode BAD CAST content changed 增加一个属性 if xmlStrcmp curNode name BAD CAST newNode3 xmlNewProp curNode BAD CAST newAttr BAD CAST YES 增加一个子节点 精品文档 14欢迎下载 if xmlStrcmp curNode name BAD CAST son xmlNewTextChild curNode NULL BAD CAST newGrandSon BAD CAST new content curNode curNode next 3 33 3SAXSAX 简单简单 APIAPI 解析解析 3 3 13 3 1 相关函数简介相关函数简介 libxml 库提供还提供了一些函数以流的形式来读取并分析 xml 文件 xmlTextReader xmlTextReaderPtr XmlReader 的结构体及其指针 xmlTextReaderPtr xmlReaderForFile const char filename const char encoding int options 打开一个 xml 文件并返回 xmlreader 对象 准备开始分析 int xmlTextReaderRead xmlTextReaderPtr reader 读取下一个节点 注意 是下一个 不是下一 个同层节点 int xmlTextReaderNext xmlTextReaderPtr reader 读取下一个同层节点 int xmlTextReaderNodeType xmlTextReaderPtr reader 判断当前节点的类型 xmlChar xmlTextReaderGetAttribute xmlTextReaderPtr reader const xmlChar name 获 取当前节点的指定属性 xmlChar xmlTextReaderReadString xmlTextReaderPtr reader 读取当前节点下的 text 精品文档 15欢迎下载 xmlNodePtr xmlTextReaderExpand xmlTextReaderPtr reader 将当前节点展开成一个节点对象 慎用 int xmlTextReaderHasValue xmlTextReaderPtr reader 判断当前节点是否有 text 值 int xmlTextReaderHasAttributes xmlTextReaderPtr reader 判断当前节点是否包含属性 int xmlTextReaderMoveToAttribute xmlTextReaderPtr reader const xmlChar name 移动 指针到当前节点的指定属性名的属性 int xmlTextReaderMoveToAttributeNo xmlTextReaderPtr reader int no 移动指针到当前节 点指定属性编号的属性 int xmlTextReaderMoveToElement xmlTextReaderPtr reader 将指针移会当前节点 int xmlTextReaderMoveToFirstAttribute xmlTextReaderPtr reader 将指针移动到当前节点 的第一属性 int xmlTextReaderMoveToNextAttribute xmlTextReaderPtr reader 将指针移动到当前节点的 下一属性 xmlChar xmlTextReaderName xmlTextReaderPtr reader 返
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《习作例文》教学设计-统编版语文六年级下册
- 5年保密协议书
- 直播号协议书
- 补救协议书咋写
- 幼儿园帮扶协议书
- 公司员工保密协议书
- 多方协议书模板
- 27.1.3 第1课时 圆周角定理 教学设计 华东师大版数学九年级下册
- 增量分红协议书
- 不朽剑神协议书
- 2025年国企中层干部竞聘笔试题含答案
- 禁止攀爬安全课件
- 渝22TS02 市政排水管道附属设施标准图集 DJBT50-159
- 中国金融黑灰产治理研究报告2025-非法代理维权的识别标准与溯源治理505mb
- 涉密测绘成果管理制度
- 2025-2030中国汽车结构胶行业市场发展趋势与前景展望战略研究报告
- T/CHC 1005-2023破壁灵芝孢子粉
- 高一上学期《国庆假期安全教育+时间规划》主题班会课件
- 2025年铁路货装值班员(高级)职业技能鉴定参考试题库(含答案)
- 2024年单招数学函数的性质专项复习试题和答案
- 星级酒店的各类客房类型介绍
评论
0/150
提交评论