博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libxml2 的一些用法
阅读量:5239 次
发布时间:2019-06-14

本文共 3204 字,大约阅读时间需要 10 分钟。

0. libxml2 是个跨平台的C库,用于操作xml文件。。

1. 结构体:

1     /*文档结构体*/ 2     typedef xmlDoc *xmlDocPtr; 3  4     /*节点结构体*/ 5     typedef struct _xmlNode xmlNode; 6     typedef xmlNode *xmlNodePtr; 7     struct _xmlNode { 8         void           *_private;    /* application data */ 9         xmlElementType   type;    /* type number, must be second ! */10         const xmlChar   *name;      /* the name of the node, or the entity */11         struct _xmlNode *children;    /* parent->childs link */12         struct _xmlNode *last;    /* last child link */13         struct _xmlNode *parent;    /* child->parent link */14         struct _xmlNode *next;    /* next sibling link  */15         struct _xmlNode *prev;    /* previous sibling link  */16         struct _xmlDoc  *doc;    /* the containing document */17 18         /* End of common part */19         xmlNs           *ns;        /* pointer to the associated namespace */20         xmlChar         *content;   /* the content */21         struct _xmlAttr *properties;/* properties list */22         xmlNs           *nsDef;     /* namespace definitions on this node */23         void            *psvi;    /* for type/PSVI informations */24         unsigned short   line;    /* line number */25         unsigned short   extra;    /* extra data for XPath/XSLT */26     };27 28     其他API:29     xmlChildElementCount/*获取节点的子节点个数*/30     /*转码API*/31     #include "iconv.h"32     int iConvert(const char *from_code, const char *to_code, const char *from_str, size_t f_len, char * to_str, size_t t_len )33     {34         iconv_t cd;35         size_t ret;36         cd = iconv_open( to_code, from_code);37         if ( cd == (iconv_t)-1 ) {38             perror("iconv open error\n");39             return -1;40         }41         ret = iconv( cd, &from_str, &f_len, &to_str, &t_len );42         if ( ret == (size_t)-1 )43         {44             perror("iconv error\n");45             iconv_close(cd);46             return -1;47         }48         iconv_close(cd);49         return ret;50     }

2.读取:

1     xmlDocPtr doc = xmlReadFile("file.xml", NULL, 0)2     /*or*/3     xmlDocPtr doc = xmlParseFile("file.xml");

3. 遍历:

1     /*各层兄弟节点的保存顺序与文件的排列顺序不能确保一致*/ 2     /*libxml的内部字节编码是utf-8,所以如果节点内容是gbk中文,获取时需要用iconv进行转码*/ 3     /* root */ 4     xmlNodePtr cur = xmlDocGetRootElement(doc); 5     /* children & sibling */ 6     cur = cur->children; /*or xmlFirstElementChild 可以跳过text节点*/ 7     while( cur ) { 8         if ( xmlStrcmp(cur->name, BAD_CAST("nodename")) == 0 ) { 9             /*read property*/10             char* p_value = xmlGetProp(cur, BAD_CAST("propername"));11             /*read content*/12             char* n_value = xmlNodeGetContent(cur);13             /*convert encode if needed*/14             ret = iConvert( "utf-8", "GBK", n_value, xmlStrlen(n_value), outbuffer, outlen);15             ...16             /*free is needed*/17             xmlFree(p_value);18             xmlFree(n_value);19         }20         cur = cur->next; /*or xmlNextElementSibling*/21     }22     xmlFree(doc);

4. 查找:

  1. 如果只查找结果项只有一个,可以通过自行遍历进行查找节点;

  2. 有多个节点匹配,可以通过 xmlXPathEval* 查找节点集;

5. 修改与保存:以后用到再补充……

转载于:https://www.cnblogs.com/aglanceofunknown/p/4612066.html

你可能感兴趣的文章
BZOJ 2005: [Noi2010]能量采集( 数论 + 容斥原理 )
查看>>
如何确定 原型与实例之间的关系
查看>>
Ruby and gnuplot installation on Ubuntu 16.04
查看>>
Windows 10 IoT Serials 8 – 如何改变UWP应用的目标平台
查看>>
java正则表达式语法详解及其使用代码实例
查看>>
第一阶段冲刺08
查看>>
.net webservers的使用
查看>>
数据库快照
查看>>
程序员修炼之道-笔记
查看>>
iOS10遇到有推送的Demo真机报错的解决
查看>>
在liferay中如何使用Ajax的请求
查看>>
liferay中如何获取实例的id和portletId
查看>>
LeetCode_Binary Tree Maximum Path Sum
查看>>
web框架UI系列--MVC常用控件讲解一
查看>>
整理小朋友在noi.openjudge上的作业(3)
查看>>
Educational Codeforces Round 30 B【前缀和+思维/经典原题】
查看>>
The Solution of UESTC 2016 Summer Training #1 Div.2 Problem A
查看>>
js检测服务器端Seesion是否存在
查看>>
AJAX 概念 优势 发展前景 工作原理 底层技术 状态 缺点 框架
查看>>
Tensorflow CPU mask-rcnn 训练模型
查看>>