没有合适的资源?快使用搜索试试~ 我知道了~
XML文件解析学习笔记XML文件解析学习笔记
资源推荐
资源详情
资源评论
XML 文件的解析--libxml 库函数解释
本站整理 网络搜集 2008-05-08 点击: 68 字体:大 中 小 我要评论
xml|函数
libxml(一)
摘要
Libxml 是一个有免费许可的用于处理 XML、可以轻松跨越多个平台的 C 语言库。这个指南提供它的基本函数的例子。
绪论
Libxml 是一个实现读、创建及操纵 XML 数据功能的 C 语言库。这个指南提供例子代码并给出它基本功能的解释。在
这个项目的主页上有 Libxml 及更多关于它可用的 资料。包含有完整的 API 文档。这个指南并不能替代这些完整的文档,
但是阐明功能需要使用库来完成基本操作。
这个指南基于一个简单的 XML 应用,它使用我写的一篇文章生成,它包含有元数据和文章的主体。
本指南中的例子代码示范如何做到:
• 解析文档
• 取得指定元素的文本
• 添加一个元素及它的内容
• 添加一个属性
• 取得一个属性的值
例子的完整代码包含在附录中
数据类型
Libxml 定义了许多数据类型,我们将反复碰到它们,它隐藏了杂乱的来源以致你不必处理它除非你有特定的需要。
xmlChar 替代 char,使用 UTF-8 编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到 UTF-8 才能使
用 libxml 的函数。在 libxml 编码 支持 WEB 页面有更多关于编码的有用信息。
XmlDoc 包含由解析文档建立的树结构,xmlDocPtr 是指向这个结构的指针。
xmlNodePtr and xmlNode 包含单一结点的结构 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 编码信息包含在 XML 标准中。
⑤取得文档根元素
⑥检查确认当前文档中包含内容。
⑦在这个例子中,我们需要确认文档是正确的类型。“Story”是在这个指南中使用文档的根类型。
取得元素内容
你找到在文档树中你要查找的元素后可以取得它的内容。在这个例子中我们查找“story”元素。进程将在冗长的树中查
找我们感兴趣的元素。我们假定期你已经有了一个名为 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”。这是一个包含有我们将查找的“keywords”的元素。它使用了
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,它有一个文档指针参
数,在这个例子中,我们仅仅 打印它。
注释
因为 xmlNodeListGetString 为它返回的字符串分配内存,你必须使用 xmlFree 释放它。
使用 XPath 取得元素内容
除了一步步遍历文档树查找元素外,Libxml2 包含支持使用 Xpath 表达式取得指定结点集。完整的 Xpath API 文档在
这里。Xpath 允许通过路径文档搜索匹配指定条件的结点。在下面的例子中,我们搜索文档中所有的“keyword”元素。
注释
下面是 Xpath 完整的讨论。它详细的使用资料,请查阅 Xpath 规范。
这个例子完整的代码参见附录 D,XPath 例程代码。
Using XPath requires setting up an xmlXPathContext and then supplying the XPath expression and the
context to the xmlXPathEvalExpression
function.
The function returns an xmlXPathObjectPtr, which includes the set of nodes satisfying the XPath
expression.
使用 XPath 需要安装 xmlXPathContext 才支持 XPath 表达式及 xmlXPathEvalExpression 函数,这个函数返回一
个 xmlXPathObjectPtr,它包含有
XPath 表达式的结点集。
xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath){
剩余21页未读,继续阅读
资源评论
李洛克07
- 粉丝: 91
- 资源: 65
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功