libxml2 的一些用法

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

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;
 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;
21     }
22     xmlFree(doc);

4. 查找:

  1. 如果只查找结果项只有一个,可以通过自行遍历进行查找节点;
  2. 有多个节点匹配,可以通过 xmlXPathEval* 查找节点集;

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

时间: 2024-10-19 02:45:30

libxml2 的一些用法的相关文章

Linux中yum和apt-get用法及区别

Linux中yum和apt-get用法及区别 一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 rpm包,安装rpm包的命令是"rpm -参数" 2 包管理工具  yum 3 支持tar包 Debian系列 1 常见的安装包格式 deb包,安装deb包的命令是"dpkg -参数" 2 包管理工具 apt-get

Docker新手入门:基本用法

Docker新手入门:基本用法 1.Docker简介 1.1 第一本Docker书 工作中不断碰到Docker,今天终于算是正式开始学习了.在挑选系统学习Docker以及虚拟化技术的书籍时还碰到了不少麻烦,主要就是没有特别经典的书!Docker的<第一版Docker书>和<Docker技术入门与实战>普遍评价不高,而<Docker开发实践>和<Dockeru源码分析>又是2015年最近才出的,评价不是很多.综合看了下,最终还是选择了<Docker开发实

Tinyxml简单使用法

1.概要介绍一下: 尝试了tinyxml,rapidxml,libxml2等3中第3方库,前两者相对较为轻量级,libxml2非常完善,强大. 这是网上总结出来的优缺点: 1.tinyxml当节点内容的空而使用GetText()方法时候会出错 2.rapidxml编码问题不是特别好 3.libxml2对内存释放要求较高,否则时常遇到core dump. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在

Python爬虫利器三之Xpath语法与lxml库的用法

前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 BeautifulSoup 使用不太习惯的话,可以尝试下 Xpath. 参考文档: lxml python 官方文档 XPath语法参考 w3school 安装 pip install lxml 利用 pip 安装即可 XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在

yum和apt-get 软件包管理器的用法及区别

yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 rpm包,安装rpm包的命令是"rpm -参数"  Redhat Package Manager2 包管理工具 yum  (全称为 Ye

js中获取时间new date()的用法

js中获取时间new date()的用法 获取时间:   var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份(4位,1970-????) 3 myDate.getMonth(); //获取当前月份(0-11,0代表1月) 4 myDate.getDate(); //获取当前日(1-31) 5 myDate.getDay();

windows平台vs2010编译64位libiconv与libxml2

(一)安装libiconv下载路径https://ftp.gnu.org/pub/gnu/libiconv/注意这里选择libiconv-1.11.1版本,因为之后的版本没有Makefile.msvc文件了.不解...cd D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64vcvars64.batcd PREFIX=D:\espa-product-formatter\XML2\libiconv-1.11.1nmake

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种: