SIP(26):VS2008使用libxml2库

来源:互联网 发布:中央财经大学网络教育 编辑:程序博客网 时间:2024/06/06 18:13

SIP(26):VS2008使用libxml2库

 (2012-11-03 09:13:52)
转载
标签: 

libxml

 

vc2008

分类: SIP探索之路

没想到今晚在编译XML的时候遇到这么大的阻碍,测试所用源代码在最末尾的地方贴出。

首先在http://xmlsoft.org/sources/win32/下载libxml2-2.7.8.win32.zip.内有编译好的libxml。解压,将其中的Include目录添加到工程。

 

然后在http://gettext.sourceforge.net/下载编译好的libiconv,解压,将其Include目录添加到工程。

 

注意需要使用.cpp文件并且选择编译为C++代码,否则会出现http://wenku.baidu.com/view/54e59b2ab4daa58da0114ac9.html这样的上百个错误,晕!!

 

 

现在编译就能通过,但是会在编译的时候出现若干个不能解析的外部变量,这明显是因为没有加入响应的.lib文件。在编译好的libxml中的lib文件夹中libxml2.lib加入项目,解决。

 

现在编译和链接都可以成功了,但是在最后运行的时候找不到dll文件,这里需要把libxml2.dll、iconv.dll、zlib1.dll。其实原本很容易应该就能成功了,但是由于从网上的zlib1.dll版本太旧,出现了下述问题:

SIP(26):VS2008使用libxml2库
从GTK+下载页下载最新的zlib,我下载的网址如下:

http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/zlib_1.2.5-2_win32.zip

 

 

 

这之后即可成功,生成了一个xml文件如下:

SIP(26):VS2008使用libxml2库

----小结-----

 其实整个过程可以看出非常简单,但是由于网上资料鱼目混珠,加上各种版本的更迭,浪费一个晚上都在弄这个问题。其次网上还有很多资料如何教编译libxml和conv,但是其实我们只需要去使用编译好的即可,无需花时间在这种问题上,分清主次。

这次提供了确实有用信息的网址如下:

http://www.myexception.cn/xml-soap/403107.htm:提供了确切的已经编译好的libxml下载地点,但是dll版本过旧,不要使用。 

http://hi.baidu.com/stray8448/blog/item/39a0d9029c4ad67f3812bb66.html:提供了确切的已经编译好的libiconv的下载地址。 

http://blog.csdn.net/qq1987924/article/details/7695234:提供了上述问题的解决方案,即最新zlib.dll的下载地址。

 

 

 

 

 

用于测试编译的源代码如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

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;

}

 

0 0
原创粉丝点击