Linux环境下C使用的XML解析库:libxml2


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”是在这个指南中使用文档的根类型。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 下一页

相关内容