libxml库解析XML文件

这篇博客详细介绍了如何使用libxml库在C语言环境中解析XML文件,包括数据类型、解析文档、获取元素内容、XPath操作、写入元素、处理属性、编码转换等关键步骤。通过实例代码展示了如何处理XML文档的各个部分,如获取和添加keyword、reference元素,以及处理编码问题。
摘要由CSDN通过智能技术生成
绪论
Libxml
是一个有免费许可的用于处理 XML 、可以轻松跨越多个平台的 C 语言库。 Libxml 实现了读、创建及操纵 XML 数据功能。  
   
这个指南基于一个简单的 XML 应用。  

数据类型
Libxml 
定义了许多数据类型,它隐藏了杂乱的来源以致你不必处理它除非你有特定的需要。 xmlChar   替代 char, 使用 UTF-8 编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到 UTF-8 才能使用 libxml 的函数。在 libxml 编码支持 WEB 页面有更多关于编码的有用信息。  
XmlDoc 
包含由解析文档建立的树结构, xmlDocPtr 是指向这个结构的指针。
xmlNodePtr and xmlNode 
包含单一结点的结构 xmlNodePtr 是指向这个结构的指针,它被用于遍历文档树。  
  
解析文档
解析文档时仅仅需要文件名并只调用一个函数,并有错误检查。
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
⑤取得文档根元素  
⑥检查确认当前文档中包含内容。  
⑦在这个例子中,我们需要确认文档是正确的类型。“ 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; 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值