Libxml2 学习


1、概要

libxml 是一个实现操作XML数据功能的开源C语言库。

2、windows下使用libxml

ftp://gd.tuwien.ac.at/pub/libxml/win32 下载 libxml2  iconv  libz  将其放到某个目录下
配置VS 项目中添加头文件和  三个的都文件都需要

3、libxml使用

3.1 libxml 生成xml文件

    主要通过函数 xmlNewDoc xmlNewNode xmlDocSetRootElement xmlNewTextChild xmlSaveFormatFileEnc 来实现
    如下代码:
    
static int Test_New(char* szFile)
{
    xmlDocPtr    doc = NULL;       //
    xmlNodePtr    rootNode = NULL;
    xmlNodePtr    node = NULL;
    xmlNodePtr    node1 = NULL;
    doc = xmlNewDoc(BAD_CAST "1.0");
    rootNode = xmlNewNode(NULL, BAD_CAST "root");
    xmlDocSetRootElement(doc, rootNode);
    node = xmlNewTextChild(rootNode, NULL, BAD_CAST "student", NULL);
    xmlNewTextChild(node, NULL, BAD_CAST "name", BAD_CAST "zhangsan");
    xmlNewTextChild(node, NULL, BAD_CAST "age", BAD_CAST "25");
    xmlNewTextChild(node, NULL, BAD_CAST "sex", BAD_CAST "labc");
    xmlNewChild(rootNode, NULL, BAD_CAST "node1", BAD_CAST "node1_test&");
    xmlNewTextChild(rootNode, NULL, BAD_CAST "node2", BAD_CAST "node2_test&");
    node = xmlNewTextChild(rootNode, NULL, BAD_CAST "node3", BAD_CAST "node3test");
    xmlNewProp(node, BAD_CAST "color", BAD_CAST "0A");
    xmlNewProp(node, BAD_CAST "attr", BAD_CAST "123");
    node = xmlNewNode(NULL, BAD_CAST "node4");
    node1 = xmlNewText(BAD_CAST "node4T<");
    xmlAddChild(rootNode, node);
    xmlAddChild(node, node1);
    xmlSaveFormatFileEnc(szFile, doc, "UTF-8", 1);
    xmlFreeDoc(doc);
    return 0;

}  


结果:

 需要几点注意的地方:
(1)这里一定注意 xmlNewDoc 中固定为1.0 千万不要写其他的,否则会出错。之前写成了V1.0 被折腾了半天。
(2)xmlNewTextChild xmlNewChild 都可以创建子节点,但是他们还是有区别的,主要区别在于如果content中包含了& < > 等符号时,使用xmlNewChild 会出错,而  xmlNewTextChild  不会出错,这些保留符号会被自动转义,所以推荐使用 xmlNewTextChild 
(3)一共提供了3中增加子节点的方法,注意 xmlNewText 也会转义特殊字符。


3.2 libxml 遍历xml文件的node


static int print_child(xmlNodePtr node)
{
    if (node == NULL)
    {
        return 1;
    }
    if (node->type == XML_ELEMENT_NODE)
    {
        printf("<%s>\n", node->name);
    }
    for (node = node->children; node != NULL; node = node->next)
    {
        print_child(node);
    }
    return 0;

}  

static int Test_AnalysisFile(char* szFile)
{
    xmlDocPtr    doc = NULL;       //文件指针
    xmlNodePtr    root = NULL;
    
    doc = xmlReadFile(szFile, "UTF-8", XML_PARSE_NOBLANKS);
    if (doc == NULL)
    {
        printf("xmlReadFile error %s\n", xmlGetLastError()->message);
        return 1;
    }
    root = xmlDocGetRootElement(doc);
    if (root == NULL)
    {
        xmlFreeDoc(doc);
        return 0;
    }
    print_child(root);
    xmlFreeDoc(doc);
    return 0;

}  


通过 xmlReadFile 函数来实现解析xml文件。
注意,这里node->children  也可以用宏定义 node->xmlChildrenNode  

3.3 转换xml Node为字符串

static int Test_ToString(char* szFile)
{
    xmlDocPtr        doc = NULL;       //文件指针
    xmlNodePtr        root = NULL;
    xmlBufferPtr    nodeBuffer;
    char            szBuf[1024] = { 0 };
    doc = xmlReadFile(szFile, "UTF-8", XML_PARSE_NOBLANKS);
    if (doc == NULL)
    {
        printf("xmlReadFile error %s\n", xmlGetLastError()->message);
        return 1;
    }
    root = xmlDocGetRootElement(doc);
    if (root == NULL)
    {
        xmlFreeDoc(doc);
        return 0;
    }
    
    nodeBuffer = xmlBufferCreate();
    xmlNodeDump(nodeBuffer, doc, root, 0, 1);
    snprintf(szBuf, sizeof(szBuf), (char*)nodeBuffer->content);
    xmlBufferFree(nodeBuffer);
    xmlFreeDoc(doc);
    printf("%s\n", szBuf);
    return 0;

}  


这里,通过xmlNodeDump来实现转换为字符串,结果如下
 
注意这里 xmlNodeDump(nodeBuffer, doc, root, 0, 1); 函数最后一个参数 如果为0的话则会去掉空白符如下

 







Libxml2 学习的更多相关文章

  1. iOS 阶段学习第23天笔记(XML数据格式介绍)

    iOS学习(OC语言)知识点整理 一.XML数据格式介绍 1)概念:xml是extensible markup language扩展的标记语言,一般用来表示.传输和存储数据 2)xml与json目前使 ...

  2. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

  3. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  4. 值得学习的C语言开源项目

    值得学习的C语言开源项目   - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...

  5. 关于学习是UIWebView的一些思考

    前几天因为数据中加载有html语言的数据,关于html语言和UIWebView,有一些纠结,经过几天的研究,也有了一些自己的简单的见解.          我有两个页面需要加载html语言(注意,这里 ...

  6. XML格式以及相关libxml库学习

    本文参考 XML文件格式语法以及DTD,摘除其中自己认为必要的知识点,在此记录如下. 先给出一个xml的实例文件, <?xml version="1.0" encoding= ...

  7. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  8. 值得学习的C/C++开源框架(转)

    值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...

  9. #0 scrapy爬虫学习中遇到的坑记录

    python 基础学习中对于scrapy的使用遇到了一些问题. 首先进行的是对Amazon.cn的检索结果页进行爬取,很顺利,无碍. 下一个目标是对baidu的搜索结果进行爬取 1,反爬虫 1.1 我 ...

随机推荐

  1. P4854 MloVtry的咸鱼树 状压+最短路

    $ \color{#0066ff}{ 题目描述 }$ 俗话说种瓜得瓜,种豆得豆,MloVtry把自己砍掉一半埋进了土里,于是它得到了一颗n个点的咸鱼树. 但是问题是由于MloVtry只舍得埋下一半的自 ...

  2. SQL中删除重复的行(重复数据),只保留一行 转

    方法一:使用在T-SQL的编程中 分配一个列号码,以COL1,COL2组合来分区排序,删除DATABASE重复的行(重复数据),只保留一行 // COL1,COL2是数据库DATABASE的栏位 de ...

  3. 20165224 陆艺杰 Exp5 MSF基础应用

    用自己的话解释什么是exploit,payload,encode Exploit是攻击的行为 Payload是一段植入目标机的简短的带功能的恶意代码 Encode是编码,用于更改恶意代码,编码特征码检 ...

  4. html的第一个程序

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. es6 封装一个登录注册的验证滑块

    1,需求分析 滑块从左滑到右,开始滑.结束滑两种状态.两种状态显示的内容和样式的不同. 这是淘宝注册验证滑块的示例图 2,代码分析 const render = Symbol('render') co ...

  6. AES/ECB/NoPadding 加减密

    package unit; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache. ...

  7. PHP返回变量或数组的字符串表示:var_export()

    使用var_export()函数可以在服务端程序没有在打印的情况下,配合file_put_contents方便的调试程序,查看变量和数组的内容. 在开发过程中,我们常用var_dump()来打印数组内 ...

  8. Oracle "set define off" 关闭替代变量功能

    set define off关闭替代变量功能 在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符号,SQL*Plus就会要你输入替代值.这就意味着 ...

  9. 【研究】缓慢的http拒绝服务攻击

    1 详细描述: 缓慢的http拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量http request攻击,直到服务器带宽被打满,造成了拒绝服 ...

  10. rm删除文件,空间没有释放

    rm删除的文件,如果其他进程正在使用这个文件,那么文件句柄并没有释放 (df仍然会统计这个文件占用的空间) 此时只能重启这个进程 正确的删除文件方法应该是 >xxx.file (最好之前加个co ...