没有合适的资源?快使用搜索试试~ 我知道了~
Libxml是一个自由授权的,用来处理XML的C语言库,它可以移植到很多的平台上。
资源详情
资源评论
资源推荐
John Fleck
Copyright © 2002, 2003 John Fleck
目录
介绍
数据类型
解析文件
获取元素内容
用 XPath 获取元素内容
写入元素内容
写入属性
获取属性
编码转换
A.编译
B.例子文档
C. Keyword 例子代码
D. Xpath 例子代码
E.添加 Keyword 的例子代码
F.添加属性的例子代码
G.获取属性值的例子代码
H.编码转换的例子代码
I.感谢
摘要
Libxml 是一个自由授权的,用来处理 XML 的 C 语言库,它可以移植到很
多的平台上。本教程为其基本函数提供了例子。
介绍
Libxml 是一个 C 语言库,用来对 XML 数据进行读取、创建和维护。这个
教程对其基本功能提供了例子代码和说明。
在 libxml 的项目主页 http://www.xmlsoft.org/上提供了关于它如何使用
的更加详尽的信息,包括完整的 API 文档 http://xmlsoft.org/html/libxml-
lib.html。本教程不能替代这些文档,而仅仅用来说明用这个库来实现 XML 基
本操作时所用到的函数。
本教程中用例子代码来演示下列内容:
解析文档;
取出指定元素里的文本;
添加元素以及它的内容;
添加属性;
取出属性的值。
全部例子代码见附录。
数据类型
Libxml 声明了一些数据类型,用来隐藏那些除非有特别需要就不用去理会
的复杂细节,这些数据类型我们总是会一次一次的遇到。
xmlChar
对 char 的基本代替,是一个 UTF-8 编码字符串中的一个字节。如果你
的数据使用了其他编码,在使用 libxml 函数前就必须转换为 UTF-8。关
于编码的更多信息见 http://www.xmlsoft.org/encoding.html。
xmlDoc和¨xmlDocPtr
是一个包含了从解析文档后创建出的树的结构。xmlDocPtr 是指向该结
构的指针。
xmlNode和¨xmlNodePtr
包含单个节点的结构。xmlNodePtr 是指向该结构的指针,它用来遍历
文档树。
解析文件
解析文件只需要文件的名字和简单的一个函数调用,再加上错误检查就可
以了。完整代码见附录 C Keyword 例子代码
①xmlDocPtr doc;
②xmlNodePtr cur;
③doc = xmlParseFile(docname);
④if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return;
}
⑤cur = xmlDocGetRootElement(doc);
⑥if (cur == NULL) {
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
return;
}
⑦if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
fprintf(stderr,"document of the wrong type, root node !=
story");
xmlFreeDoc(doc);
return;
}
① 声明指向你要解析的文档的指针。
② 声明一个节点指针(处理单个的节点的时候需要它)。
④ 检查解析文档是否成功。如果没有,libxml 会在此处报错并终止。
→ 注意
此处常见的错误是对编码的错误处理。XML 标准要求,如果一个文档
不是用 UTF-8 或 UTF-16 编码的,文档内必须包含有编码的明确声明。如
果文档声明了编码,libxml 会自动的为你做必要的到 UTF-8 的编码转换。
关于 XML 编码要求的更多详情见 http://www.w3.org/TR/REC-xml#charencoding。
⑤ 获取文档的根元素。
⑥ 检查确认文档包含了东西。
⑦ 在我们的例子里,我们需要确认文档内容正确,”story”是在本教程中使
用到的文档的根类型。
获取元素内容
获取一个元素的内容需要遍历文档树直到发现你要找的东西。下面的例子,
我们要找一个叫”keyword”的元素,它保存在一个叫”storyinfo”的元素里面。
寻找这个节点的过程就需要遍历这棵树,这比较令人郁闷。我们假设你已经有
了一个叫 doc 的 xmlDocPtr 和叫 cur 的 xmlNodPtr 变量。
①cur = cur->xmlChildrenNode;
②while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo")))
{
parseStory (doc, cur);
}
cur = cur->next;
}
① 获得 cur 的第一个子节点。此时,cur 指向文档的根,也就是”story”元素。
② 这个循环遍历”story 的所有子元素,寻找叫”storyinfo”的元素,也就是那个
我们要寻找的包含”keyword”的那个元素。这里使用了 libxml 的字符串比较函
数--xmlStrcmp。如果有匹配的,就调用函数 parseStory。
void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
①cur = cur->xmlChildrenNode;
②while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
③key = xmlNodeListGetString(doc, cur-
>xmlChildrenNode, 1);
printf("keyword: %s\n", key);
xmlFree(key);
}
cur = cur->next;
}
return;
}
① 又是获得了第一个子节点。
② 就像上个循环,我们遍历节点,寻找感兴趣的那个。在这个例子里
是”keyword”。
③ 我们发现”keyword”元素之后,就打印出来。要记住,在 XML 中,一个元
素包含的文本是这个元素的一个子节点,所以我们转向 cur-
>xmlChildrenNode。要获取它,我们使用函数 xmlNodeListGetString,
它也要把 doc 指针作为一个参数。在这儿,我们仅仅把它打印出来。
→ 注意
因为 xmlNodeListGetString 为它返回的字符串分配了动态内存,你必
须用 xmlFree 来释放它。
使用 Xpath 来获取元素内容
除了用遍历文档树的方式来寻找一个元素外,libxml2 还支持使用 XPath
表达式来获取满足指定条件的节点集合。关于 XPath API的完整文件
见 http://xmlsoft.org/html/libxml-xpath.html。
XPath 允许在一个文档中寻找到符合条件的所有节点。下面的例子中,我
们在文档中寻找到所有的”keyword”元素。
→ 注意
对 XPath的完整讨论超出了本文的范畴,关于它使用的详情参见 http://
www.w3.org/TR/xpath。
本例子的完整代码在¨附录 D XPath 例子程序。
使用 XPath 就要先设置一个 xmlXPathContext,然后把这个 XPath 表达
式和上下文提交给 xmlXPathEvalExpression 函数。函数返回
xmlXPathObjectPtr,它包含着符合 XPath 表达式的节点集合。
xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath){
①xmlXPathContextPtr context;
xmlXPathObjectPtr result;
②context = xmlXPathNewContext(doc);
③result = xmlXPathEvalExpression(xpath, context);
④if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
xmlXPathFreeObject(result);
printf("No result\n");
return NULL;
}
① 首先我们声明变量。
② 初始化 context 变量。
③ 应用 XPath 表达式。
④ 检查结果,如果没有结果,释放分配给结果的动态内存。
函数返回的 xmlPathObjectPtr 包含着节点集合以及用来遍历集合和操作
结果的所需要的其它信息。在本例中,我们的函数返回了
xmlXPathObjectPtr。我们用它来打印我们文档中 keyword 节点的内容。节
点集合对象包含了集合中元素的个数(nodeNr)和一个节点的数组(nodeTab)。
剩余16页未读,继续阅读
dd_echo
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0