微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

libxml2-xml解析工具(依赖libiconv、zlib库)

libxml2-xml解析工具(依赖libiconv、zlib库)

C/C++之其他库 2010-05-19 16:28:53 阅读456 评论0 字号:订阅

libxml2:库的简介和安装配置

1. 安装、使用比较简单,容易入门;
2. 支持的编码格式较多,能很好的解决中文问题(使用一个很简单的编码转换函数);
3. 支持Xpath解析(这点对于任意定位xml文档中的节点还是很有用的哦);
4. 支持well-formed 和valid验证,具体而言支持DTD验证,Schema验证功能正在完善中(目前多数解析器都还不完全支持shema验证功能);
5. 支持目前通用的Dom、Sax方式解析等等。

linux安装:
安装
1)从xmlsoft站点或ftp(ftp.xmlsoft.org)站点下载libxml压缩包(libxml2-xxxx.tar.gz)
2)对压缩包进行解压缩
tar xvzf libxml2-xxxx.tar.gz
3)进入解压缩后的文件夹中运行
#>./configure --prefix /home/user/myxml/xmlinst(此处为待安装的路径)
#>make
#>make install
#>export PATH=/home/user/myxml/xmlinst/bin:$PATH //添加路径

window的安装:
libxml2需要zlib,libiconv的支持才能运行
zlib的安装:下载后查看makeFile.msc文件
在vs.net的命令窗口运行cmd,
进入win32\中执行:nmake -f win32/Makefile.msc
libiconv库的安装和配置
在vs.net的命令窗口中运行cmd,进入根目录中执行:
nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD

1.vs-cmd进入libxml2-2.7.6\win32目录
2.然后运行cscript:
cscript configure.js iconv=no zlib=no static=yes cruntime=/MD prefix=.\Release
如何使用静态库则用cruntime=/MT
3.修改..\testapi.c(295行)将 '?修改为'?'
4.nmake clean all就会生成对应的库(bin.msvc目录里)

libxml2的使用介绍

xml数据结构:
xmlChar:对char的基本代替,是一个UTF-8编码字符串中的一个字节
xmlDoc 和 xmlDocPtr: 树的结构
xmlNode 和 xmlNodePtr:单个节点的结构

生成xmldoc、获得根节点,获得子节点

//4. 解析xml字符串
xmlDocPtr doc = xmlParseMemory(pXml,length);

//根据xmldoc获得xml的根节点
xmlNodePtr cur = xmlDocgetRootElement(doc);

//获得子节点:->children获得不是第一个子节点,必须用next才能获得第一个子节点
cur = cur->children;
cur = cur->next;

// 获得节点信息中的内容: 注意释放资源
xmlChar* key = xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
xmlFree(key);

//获得节点信息属性的值:属性name,注意释放资源
xmlChar* fversion = xmlGetProp(cur,"version");
xmlFree(fversion);



//根节点相关函数
xmlNodePtr xmlDocgetRootElement (xmlDocPtr doc) //获取文档根节点
xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc,xmlNodePtr root) //设置文档根节点

//创建子节点相关函数
xmlNodePtr xmlNewNode (xmlNsPtr ns,const xmlChar * name) //创建新节点
xmlNodePtr xmlNewChild (xmlNodePtr parent,xmlNsPtr ns,const xmlChar * name,const xmlChar * content) //创建新的子节点
xmlNodePtr xmlcopyNode ( const xmlNodePtr node,int extended) //复制当前节点

//添加子节点相关函数
xmlNodePtr xmlAddChild (xmlNodePtr parent,xmlNodePtr cur) //给指定节点添加子节点
xmlNodePtr xmlAddNextSibling (xmlNodePtr cur,xmlNodePtr elem) //添加一个兄弟节点
xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur,xmlNodePtr elem) //添加一个兄弟节点
xmlNodePtr xmlAddSibling (xmlNodePtr cur,xmlNodePtr elem) //添加兄弟节点

//属性相关函数
xmlAttrPtr xmlNewProp (xmlNodePtr node,const xmlChar * value) //创建新节点属性
xmlChar * xmlGetProp (xmlNodePtr node,const xmlChar * name) //读取节点属性
xmlAttrPtr xmlSetProp (xmlNodePtr node,const xmlChar * value) //设置节点属性

=xmlNodeListGetstring(doc,1);
=xmlNodeContent(cur);


一个xmldoc解析解析

void CCommunicationThread::par***ml_doc(xmlDocPtr doc,xmlNodePtr cur,const char* path)
{
//1.进入xml的目录时:判断该目录是否存在?否则创建
cur = cur->children;
if (cur == NULL)
return;

cur = cur->next;
if (cur == NULL)
return;

check_and_create_path(path);
SVN_MAP file_map;
char* pMapBuffer = this->get_fileInfor_list(path,file_map);


//2.将服务器的新版、新增文件信息,压入准备下载的队列,启动线程开始下载.
xmlChar* fileName;
xmlChar* fiLeversion;
SVN_MAP map_new;


while ( cur != NULL)
{
if ( strcmp(( char*)cur->name,"folder") == 0)
{
string curPath = path;
fileName = xmlGetProp(cur,( const xmlChar *) "name");
curPath = curPath + "\\" + (char*)fileName;

par***ml_doc(doc,cur,curPath.c_str());
}
else if (strcmp((char*)cur->name,"
file ") == 0)
{
// 判断一个文件是否存在?文件是否修改文件版本号是否与当前的版本号相同?
fileName = xmlGetProp(cur,(const xmlChar *)"
name ");
fiLeversion = xmlGetProp(cur,(const xmlChar *)"
version");

FILE_SVN_INFOR* svn_infor = new FILE_SVN_INFOR;
strcpy(svn_infor->filename,( const char*)fileName);
svn_infor->version = 0;

SVN_MAP::iterator it = file_map. find(( char*)fileName);
if (it != file_map. end())
{
// 找到该信息,查看版本号
if ( atoi(( const char*)fiLeversion) > it-> second->version) //新版本
{
File_Infor* infor = new File_Infor();
strcpy(infor->command,CMD_DOWNLOAD);
strcpy(infor->param.download.fileName,( const char*)fileName);
this->push_list(infor);
}

svn_infor->md5 = it-> second->md5;
}
else
{
// 新增
File_Infor* infor = new File_Infor();
strcpy(infor->command,( const char*)fileName);
this->push_list(infor);

memset(&svn_infor->md5,sizeof(MD5));
}


// 组织新的.svn文件
map_new[svn_infor->filename] = svn_infor;

xmlFree(fileName);
xmlFree(fiLeversion);
}
cur = cur->next;
}

//3.在退出xml目录时:根据文件新的版本存储.svn文件
free(pMapBuffer);
set_fileInfor_list(path,map_new);
for ( SVN_MAP::iterator it = map_new. begin(); it != map_new. end(); it++ )
{
delete it-> second;
}
map_new. clear();

return; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类