`

libxml2-xml 解析

    博客分类:
  • c++
阅读更多

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::parseXml_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;
 
 parseXml_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-2.9.0+64位+lib

    libxml2是一款开源的XML解析库,由Daniel Veillard开发,它提供了丰富的XML处理功能,包括解析、编码、XPath查询、XSLT转换等。在本篇文章中,我们将重点探讨libxml2-2.9.0版本在Windows 64位平台上的使用、编译和...

    libxml2-2.6.32.tar.gz

    本篇将详细探讨libxml2-2.6.32这一版本的XML解析库,以及它与PHP中的GD库集成的重要性和过程,特别是如何通过安装依赖如zlib、freetype、libpng和jpeg来提升GD库的功能,以满足Cacti WeatherMap插件的需求。...

    libxml2-2.9.1.tar.gz

    libxml2是一个用来解析XML文档的函数库。它用 C 语言写成,并且能被多种语言所调用,如 C、C++、XSH、C#、Python、Kylix、Delphi、Ruby、PHP 等。 注:先解压得到libxml2-2.9.1.tar.gz文件,然后再拷贝到linux系统...

    libxml2-python-2.6.11.rpm(好不容易找到的)

    libxml2是广泛使用的开源XML解析器,由 GNOME 项目开发,其功能强大且性能优异,支持多种XML相关的标准,如XPath、XPointer、XSLT和XML Schema。 这个2.6.11版本的rpm包特别适用于运行Red Hat Enterprise Linux、...

    libxml2-2.9.9.tar.gz

    《深入解析libxml2:XML解析与工具库的明珠》 libxml2是GNOME项目中的XML C解析器和工具库,它为开发者提供了一套强大的API,用于处理XML、HTML、XInclude、XPath、XPointer、XSLT、SGML、DTD、Namespaces等多种XML...

    libxml2-2.9.1

    1. **解析器**:库中包含高效的XML解析器,能够处理各种XML文档,包括非规范化格式(如HTML)。解析器能够识别XML语法,构建文档对象模型(DOM),或者以SAX(Simple API for XML)事件驱动方式处理文档。 2. **DOM...

    libxml2-2.9.7.tar.gz

    libxml2是一个强大的XML解析库,由Gnome项目开发并维护,广泛应用于各种操作系统环境,包括Linux、Windows以及Mac OS X等。这个名为"libxml2-2.9.7.tar.gz"的压缩包文件,包含了libxml2库的源代码,版本号为2.9.7。...

    libxml2-2.8.0.tar.gz

    libxml2是XML解析的基石,由Gnome项目开发,提供了全面的XML处理功能,包括解析、验证、编码和XPath支持。版本2.8.0是对这个库的一次重要更新,它引入了多项优化和修复,以增强性能和稳定性。理解libxml2的核心功能...

    libxml2-解析xml格式文件

    在libxml2库中,XML解析主要通过以下几种方式实现: 1. **SAX (Simple API for XML) 解析**:SAX是一种事件驱动的解析方式,它不将整个XML文档加载到内存中,而是逐个处理元素和属性,适用于处理大型XML文件。在...

    libxml2-2.9.14源码

    Libxml2作为C语言的XML处理库,为开发者提供了强大的工具,无论是XML解析、XPath查询还是内存管理,都有高效且稳定的实现。通过学习和使用libxml2-2.9.14源码,开发者不仅可以掌握XML处理的基础知识,还能深入了解...

    libxml2-2.9.8源码及编译方法

    **libxml2库详解与2.9.8版本...通过本文提供的编译步骤,开发者可以在本地环境中顺利构建并使用libxml2,为XML解析和处理提供便利。在实际项目中,正确理解和使用libxml2的各种API,将有助于提升程序的效率和健壮性。

    libxml2-2.7.6.tar.gz 源代码

    1. XML解析:libxml2的核心是XML解析器,它能够将XML文档转换为内部的树形结构,便于程序进行后续处理。这一过程包括了解析文档的语法,验证元素、属性和命名空间的合法性,并构建DOM(Document Object Model)树。 ...

    libxml2-2.7.2-1

    libxml2是开源软件领域中广泛使用的XML解析库,它的版本号为2.7.2-1,这一版本为用户提供了一个强大的XML处理工具。XML,即可扩展标记语言(eXtensible Markup Language),是一种用于存储和传输数据的格式,特别是...

    libxml2-2.9.4-rc2.tar.gz

    1. **XML解析**:libxml2提供了两种解析方式,SAX式(事件驱动)和DOM式(树型结构)。SAX解析适用于大型文档,内存效率高;DOM解析则方便对整个文档进行操作,但需消耗更多内存。 2. **HTML解析**:除了XML,...

    libxml2-devel-2.6.26-2.1.2.8.i386.rpm

    《libxml2-devel-2.6.26-2.1.2.8.i386.rpm:XML解析与开发的基石》 libxml2是一款广泛使用的开源XML库,其开发版本libxml2-devel是针对程序员设计的,包含了编译和开发libxml2所需的所有头文件和库文件。标题中的...

    libxml2-2.6.23.tar.gz

    libxml2是一个开源的XML解析库,由Gnome项目维护,其版本号为2.6.23,广泛应用于各种操作系统中,包括Linux、Unix以及Windows等。这个压缩包文件“libxml2-2.6.23.tar.gz”包含了该库的源代码,允许开发者在本地环境...

    libxml2-2.9.3 免积分

    **libxml2-2.9.3:XML解析库的核心详解** libxml2是一个开源的、跨平台的C语言库,用于处理XML(可扩展标记语言)和其他相关的数据格式,如HTML、XHTML和SGML。它由Gnome项目开发,并广泛应用于各种操作系统和软件...

    libxml2-2.7.5.tar

    《libxml2-2.7.5:XML解析的核心库》 XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于网络数据交换、配置文件存储等场景。为了处理XML文档,开发者通常需要使用专门的解析库,其中libxml2...

    libxml2-2.9.1-git

    libxml2是全球最广泛使用的XML解析库之一,它为开发者提供了一系列强大的工具来处理XML文档。这个库由Gnome项目开发,其最新版本2.9.1在功能和性能上都有着显著的提升。本文将深入探讨libxml2的核心特性、使用场景...

    libxml2-2.6.19.tar.gz

    libxml2是一个开源的XML解析库,它的版本号为2.6.19,这个软件包以`.tar.gz`格式提供,是Unix/Linux环境中常见的源码打包方式。libxml2由Gnome项目开发并维护,它在XML处理领域扮演着重要的角色,广泛应用于各种操作...

Global site tag (gtag.js) - Google Analytics