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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip