libxml2 的一些用法
2015-06-30 23:07
309 查看
0. libxml2 是个跨平台的C库,用于操作xml文件。API Reference。
1. 结构体:
2.读取:
3. 遍历:
4. 查找:
1. 如果只查找结果项只有一个,可以通过自行遍历进行查找节点;
2. 有多个节点匹配,可以通过 xmlXPathEval* 查找节点集;
5. 修改与保存:以后用到再补充……
1. 结构体:
/*文档结构体*/ typedef xmlDoc *xmlDocPtr; /*节点结构体*/ typedef struct _xmlNode xmlNode; typedef xmlNode *xmlNodePtr; struct _xmlNode { void *_private; /* application data */ xmlElementType type; /* type number, must be second ! */ const xmlChar *name; /* the name of the node, or the entity */ struct _xmlNode *children; /* parent->childs link */ struct _xmlNode *last; /* last child link */ struct _xmlNode *parent; /* child->parent link */ struct _xmlNode *next; /* next sibling link */ struct _xmlNode *prev; /* previous sibling link */ struct _xmlDoc *doc; /* the containing document */ /* End of common part */ xmlNs *ns; /* pointer to the associated namespace */ xmlChar *content; /* the content */ struct _xmlAttr *properties;/* properties list */ xmlNs *nsDef; /* namespace definitions on this node */ void *psvi; /* for type/PSVI informations */ unsigned short line; /* line number */ unsigned short extra; /* extra data for XPath/XSLT */ }; 其他API: xmlChildElementCount/*获取节点的子节点个数*/ /*转码API*/ #include "iconv.h" 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 ) { iconv_t cd; size_t ret; cd = iconv_open( to_code, from_code); if ( cd == (iconv_t)-1 ) { perror("iconv open error\n"); return -1; } ret = iconv( cd, &from_str, &f_len, &to_str, &t_len ); if ( ret == (size_t)-1 ) { perror("iconv error\n"); iconv_close(cd); return -1; } iconv_close(cd); return ret; }
2.读取:
xmlDocPtr doc = xmlReadFile("file.xml", NULL, 0) /*or*/ xmlDocPtr doc = xmlParseFile("file.xml");
3. 遍历:
/*各层兄弟节点的保存顺序与文件的排列顺序不能确保一致*/ /*libxml的内部字节编码是utf-8,所以如果节点内容是gbk中文,获取时需要用iconv进行转码*/ /* root */ xmlNodePtr cur = xmlDocGetRootElement(doc); /* children & sibling */ cur = cur->children; /*or xmlFirstElementChild 可以跳过text节点*/ while( cur ) { if ( xmlStrcmp(cur->name, BAD_CAST("nodename")) == 0 ) { /*read property*/ char* p_value = xmlGetProp(cur, BAD_CAST("propername")); /*read content*/ char* n_value = xmlNodeGetContent(cur); /*convert encode if needed*/ ret = iConvert( "utf-8", "GBK", n_value, xmlStrlen(n_value), outbuffer, outlen); ... /*free is needed*/ xmlFree(p_value); xmlFree(n_value); } cur = cur->next; /*or xmlNextElementSibling*/ } xmlFree(doc);
4. 查找:
1. 如果只查找结果项只有一个,可以通过自行遍历进行查找节点;
2. 有多个节点匹配,可以通过 xmlXPathEval* 查找节点集;
5. 修改与保存:以后用到再补充……
相关文章推荐
- Golang Email
- webstorm入门1-主题和配色
- webstorm入门1-主题和配色
- 基于Processing的人物移动演示:两点间匀速移动
- mongodb的分布式集群(1、主从复制)
- 数据库重复写入数据问题处理
- autossh SSH反向隧道使用
- Flask中endpoint的理解
- .Net配置文件——反射+配置文件存储类型实例
- .Net配置文件——反射+配置文件存储类型实例
- SMO要点总结
- CS,一,数据存储
- MAC常用java开发软件
- 使用 Fluent API 配置/映射属性和类型2
- Ceph性能优化总结(v0.94)
- WebView无法显示微社区
- Java学习日记之方法
- 结构及其使用 struct (C#)
- java中的set集合
- block 的ARC和MRC中的区别