资源描述:
《linux环境下c使用的xml解析库》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux环境下C使用的XML解析库:libxml2 2010-12-0918:16:58
2、 分类:Linux
3、 标签:
4、字号大中小 订阅Libxml是一个实现读、创建及操纵XML数据功能的C语言库。这个指南提供例子代码并给出它基本功能的解释。在这个项目的主页上有Libxml及更多关于它可用的资料。包含有完整的API文档。这个指南并不能替代这些完整的文档,但是阐明功能需要使用库来完成基本操作。这个指南基于一个简单的XML应用,它使用我写的一篇文章生成,它包含有元数据和文章的主体。本指南中的例子
5、代码示范如何做到:?解析文档?取得指定元素的文本?添加一个元素及它的内容?添加一个属性?取得一个属性的值例子的完整代码包含在附录中数据类型Libxml定义了许多数据类型,我们将反复碰到它们,它隐藏了杂乱的来源以致你不必处理它除非你有特定的需要。xmlChar替代char,使用UTF-8编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到UTF-8才能使用libxml的函数。在libxml编码支持WEB页面有更多关于编码的有用信息。XmlDoc包含由解析文档建立的树结构,xmlDocPtr是指
6、向这个结构的指针。xmlNodePtrandxmlNode包含单一结点的结构xmlNodePtr是指向这个结构的指针,它被用于遍历文档树。解析文档解析文档时仅仅需要文件名并只调用一个函数,并有错误检查。完整代码:附录C,Keyword例程代码①xmlDocPtrdoc;②xmlNodePtrcur;③doc=xmlParseFile(docname);④if(doc==NULL){fprintf(stderr,"Documentnotparsedsuccessfully.");return;}⑤
7、cur=xmlDocGetRootElement(doc);⑥if(cur==NULL){fprintf(stderr,"emptydocument");xmlFreeDoc(doc);return;}⑦if(xmlStrcmp(cur->name,(constxmlChar*)"story")){fprintf(stderr,"documentofthewrongtype,rootnode!=story");xmlFreeDoc(doc);return;}①定义解析文档指针。②定义结点指针(你
8、需要它为了在各个结点间移动)。④检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。注释一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中。⑤取得文档根元素⑥检查确认当前文档中包含内容。⑦在这个例子中,我们需要确认文档是正确的类型。“Story”是在这个指南中使用文档的根类型。取得元素内容你找到在文档树中你要查找的元素后可以取得它的内容。在
9、这个例子中我们查找“story”元素。进程将在冗长的树中查找我们感兴趣的元素。我们假定期你已经有了一个名为doc的xmlDocPtr和一个名为cur的xmlNodPtr。①cur=cur->xmlChildrenNode;②while(cur!=NULL){if((!xmlStrcmp(cur->name,(constxmlChar*)"storyinfo"))){parseStory(doc,cur);}cur=cur->next;}①取得cur的第一个子结点,cur指向文档的根,即“story”
10、元素。②这个循环迭代通过“story”的子元素查找“storyinfo”。这是一个包含有我们将查找的“keywords”的元素。它使用了libxml字符串比较函数xmlStrcmp。如果相符,它调用函数parseStory。voidparseStory(xmlDocPtrdoc,xmlNodePtrcur){xmlChar*key;①cur=cur->xmlChildrenNode;②while(cur!=NULL){if((!xmlStrcmp(cur->name,(constxmlChar*)"
11、keyword"))){③key=xmlNodeListGetString(doc,cur->xmlChildrenNode,1);printf("keyword:%s",key);xmlFree(key);}cur=cur->next;}return;}①再次取得第一个子结点。②像上面那个循环一样,我们能过迭代,查找我们感兴趣的叫做“keyword”的元素。③当我们找到元素“keyword”时,我们需要打印它包含在XML中的记录的内容,文本被包含于元素的子结点中