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

2024-02-28 03:18

本文主要是介绍libxml2-xml 开源库解析工具(依赖libiconv、zlib库),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

libiconv 库是一个基于 GNU 协议的开源库,主要是解决多语言编码处理转换等应用问题。
zlib是提供数据压缩用的开源的函式库。

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 * name, const xmlChar * value) //创建新节点属性
xmlChar * xmlGetProp (xmlNodePtr node, const xmlChar * name) //读取节点属性
xmlAttrPtr xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //设置节点属性

=xmlNodeListGetstring(doc, cur->xmlChildrenNode, 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, CMD_DOWNLOAD);
strcpy(infor->param.download.fileName, (const char*)fileName);
this->push_list(infor);

memset(&svn_infor->md5, 0, 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;
}


这篇关于libxml2-xml 开源库解析工具(依赖libiconv、zlib库)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754296

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as