现在的位置: 首页 > 综合 > 正文

C++操作xml之一—Libxml2

2013年10月13日 ⁄ 综合 ⁄ 共 2939字 ⁄ 字号 评论关闭

C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,选用LIBXML2

Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。

Libxml2的下载地址是http://xmlsoft.org/

windows版本的的下载地址是http://www.zlatkovic.com/libxml.en.html

libxml2库依赖iconvzlib库,所以需要下载三个

成功版本libxml2-2.6.30.win32.zipzlib-1.2.3.win32.zipiconv-1.9.2.win32.zip

解压,在系统变量path中加上iconv-1.9.2.win32\bin;zlib-1.2.3.win32\bin;libxml2-2.6.30.win32\bin这三个地址。或者把其中的三个dll到拷贝到system32目录中

编译链接基于libxml2的程序,在VC环境中设置libinclude路径,并在link设置中添加libxml2.libiconv.lib.

vc:项目->属性->c/c++->常规->附加包含目录,将三个文件夹的include下的.h头文件包含进工程

项目->属性->链接器->常规->附加库目录,将三个文件夹的bin下的.lib库文件包含进工程

注意,这只是将目录包含进工程,需要使用时需在代码中写

#include <libxml/parser.h>(eg)

#pragma   comment(lib,"libxml2.lib")(eg)

实验代码如下

/********************************************************************

    created:   2007/11/09

    created:   9:11:2007   15:34

    filename: CreateXmlFile.cpp

    author:       Wang xuebin

    depend:       libxml2.lib

    build:     nmake TARGET_NAME=CreateXmlFile

    purpose:   创建一个xml文件

*********************************************************************/

#pragma   comment(lib,"libxml2.lib")
#pragma   comment(lib,"iconv.lib")

#include <stdio.h>

#include <libxml/parser.h>

#include <libxml/tree.h>

#include <iostream>
using namespace std;

int main()

{

    //定义文档和节点指针

    xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");

    xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root");

    //设置根节点

    xmlDocSetRootElement(doc,root_node);

    //在根节点中直接创建节点

    xmlNewTextChild(root_node, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content");

    xmlNewTextChild(root_node, NULL, BAD_CAST "newNode2", BAD_CAST "newNode2 content");

    xmlNewTextChild(root_node, NULL, BAD_CAST "newNode3", BAD_CAST "newNode3 content");

    //创建一个节点,设置其内容和属性,然后加入根结点

    xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2");

    xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT");

    xmlAddChild(root_node,node);

    xmlAddChild(node,content);

    xmlNewProp(node,BAD_CAST"attribute",BAD_CAST "yes");

    //创建一个儿子和孙子节点

    node = xmlNewNode(NULL, BAD_CAST "son");

    xmlAddChild(root_node,node);

    xmlNodePtr grandson = xmlNewNode(NULL, BAD_CAST "grandson");

    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "This is a grandson node"));

    //存储xml文档

    int nRel = xmlSaveFile("CreatedXml.xml",doc);

    if (nRel != -1)

    {

       cout<<"一个xml文档被创建,写入"<<nRel<<"个字节"<<endl;

    }

    //释放文档内节点动态申请的内存

    xmlFreeDoc(doc);

    return 1;

}

创建一个xml文档其流程如下:

l         xmlNewDoc函数创建一个文档指针doc

l         xmlNewNode函数创建一个节点指针root_node

l         xmlDocSetRootElementroot_node设置为doc的根结点;

l         root_node添加一系列的子节点,并设置子节点的内容和属性;

l         xmlSaveFilexml文档存入文件;

l         xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存。

注意,有多种方式可以添加子节点:第一是用xmlNewTextChild直接添加一个文本子节点;第二是先创建新节点,然后用xmlAddChild将新节点加入上层节点。

产生如下文件

<?xml version="1.0"?>
- -<root>
<       <newNode1>newNode1
content
</newNode1>
<       <newNode2>newNode2
content
</newNode2>
<        <newNode3>newNode3
content
</newNode3>
<        <node2 attribute="yes">NODE
CONTENT
</node2>
-        -<son>
<               <grandson>This
is a grandson node
</grandson>
       </son>
</root>

抱歉!评论已关闭.