推荐一款高效Cpp解析xml工具--RapidXml

article/2025/9/13 8:33:13

解析效率比Xerces DOM 快50-100倍,tinyxml30-60 ,作者自己牛逼哄哄的说这是他所知道的最快的xml解析库了~~

作者介绍说:" The table below compares speed of RapidXml to some other parsers, and to strlen() function executed on the same data. On a modern CPU (as of 2007), you can expect parsing throughput to be close to 1 GB/s. As a rule of thumb, parsing speed is about 50-100x faster than Xerces DOM, 30-60x faster than TinyXml, 3-12x faster than pugxml, and about 5% - 30% faster than pugixml, the fastest XML parser I know of. "

 
项目地址:http://rapidxml.sourceforge.net/

具体介绍可以到这边看看http://rapidxml.sourceforge.net/manual.html

嘛也不说 通过一个例子来看看这个工具的好用之处。

 xml 文件:

<?xml version="1.0" encoding="utf-8" ?>
<root>
<title id="1" qnums="1">
<name  color="255,255,50" fontsize="16" >TEST</name>
<question type="math" gentype="auto" desc="because 1+1=2" ><![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then{return 1;}
else{return 0;}
}
]]>
</question>
</title>
</root>

源码:

// example.cpp : Defines the entry point for the console application.
//#include "stdafx.h"#include "rapidxml/rapidxml.hpp"
#include "vector"
#include "windows.h"
#include "iostream"
using namespace std;
using namespace rapidxml;#include "stdio.h"#define GET_ATTRIBUTE(pRetval,node,val)  xml_attribute<> *pAttr##pRetval=(node)->first_attribute((val));\if (pAttr##pRetval){	(pRetval)=pAttr##pRetval->value();} /*
只适用在用parse_default解析的情况下。
*/
const char *GetNodeValue(xml_node<> *node )
{if (node == NULL){return "";}if (node->value()!=NULL && (node->value())[0]!='\0' ){return node->value();}xml_node<> *cdatanode=node->first_node();if (cdatanode !=NULL && cdatanode->type() == node_cdata){return cdatanode->value();}return "";
}/*
parse_default:为了提高效率会将原始数据改变,每个属性值后面加上结束符\0
parse_non_destructive:不会改变原始数据
*/int parseDataXml(const char *szXml)
{try{xml_document<char> doc;   // character type defaults to chardoc.parse<parse_default>((char *)szXml); //parse_non_destructive  xml_node<> *root = doc.first_node();// 获取跟节点xml_node<> *TitleNode = root->first_node("title"); if (TitleNode){xml_node<> *NameNode = TitleNode->first_node("name");string strName;strName=GetNodeValue(NameNode);printf("strName[%s]\n",strName.c_str());string color;char *pcolor=NULL;GET_ATTRIBUTE(pcolor,NameNode,"color");printf("pcolor[%s]\n",pcolor==NULL?"":pcolor);}		}catch(parse_error &e){printf("%s\n",e.what());}return 1;
}int _tmain(int argc, _TCHAR* argv[])
{{FILE *fp=NULL;fp=fopen("data.xml","rb");char buf[1024];string xml="";while ( fgets(buf,1024,fp)!= NULL){xml+=buf;}fclose(fp);parseDataXml(xml.c_str());}getchar();return 1;
}

输出:


 

对于这个开源库,轻量级,dom模型表述清晰 。我实在找不到缺点,因为项目的关系 主要还是用它作为解析用,所以我还是把它封装了多几个接口:

int GetXmlAttrValue(xml_node<> *node,const char *val,std::string &strval);

int GetXmlNodeValue(xml_node<> *node ,string &retVal);    

int GetXmlChildNodeValue(const xml_node<> *rootNode,const char* pszChildStr  ,string &strRet);

int GetXmlNode(const xml_node<> *rootNode,STR_VECTOR & VecStr  , xml_node<> * &stRetNode);

 

 

 源码下载

不对之处敬请谅解~~ 欢迎交流~~~微笑



 


http://chatgpt.dhexx.cn/article/OQHcAdSD.shtml

相关文章

C++中rapidxml用法及例子

rapidxml是一个快速的xml库&#xff0c;比tinyxml快了50-100倍。本文给出创建、读取、写入xml的源码。 由于新浪博客不支持文本文件上传&#xff0c;在使用下面代码需要先下载 rapidxml&#xff0c;关于这个库的下载地址为&#xff1a; 官方网站&#xff1a; http://rapidxml.…

C++ Xml解析的效率比较(Qt/TinyXml2/RapidXml/PugiXml)

C Xml解析的效率比较&#xff08;Qt/TinyXml2/RapidXml/PugiXml&#xff09; C Xml解析的效率比较QtTinyXml2RapidXmlPugiXml 问题背景测试环境Qt - QDomDocumentTinyXml-2RapidXmlPugiXml总结 通常我们在一些软件的初始化或者保存配置时都会遇到对XML文件的操作&#xff0c;包…

SlimXml和TinyXml,RapidXml的性能对比

July 18th, 2010 zero Leave a comment Go to comments 前两天有朋友问&#xff0c;我的SlimXml有没有和RapidXml对比过效率&#xff1f;我是第一次听说这个库&#xff0c;更不用说对比效率了&#xff0c;于是上他们网站看了下。 好家伙&#xff0c;居然号称比TinyXml快30&…

RapidXml使用

vs2017 rapidxml-1.13 1 RapidXml使用 1.1 创建xml #include <iostream> #include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_utils.hpp" #include "rapidxml/rapidxml_print.hpp"using namespace rapidxml;void crateXml(…

使用rapidxml解析xml

rapidxml是一个由C模板实现的高效率xml解析库&#xff0c;号称解析速度比tinyxml快50倍&#xff08;忽悠&#xff09;&#xff0c;并作为boost::property的内置解析库&#xff1a; 其独立版本的官网&#xff1a;http://rapidxml.sourceforge.net/ 使用rapidxml的方法tinyxml极其…

RapidXml读取并修改XML文件

RapidXml读取并修改XML文件 RapidXml介绍RapidXml读取与修改xml文件 RapidXml介绍 RapidXml尝试创建最快的XML解析器&#xff0c;同时保留可用性&#xff0c;可移植性和合理的W3C兼容性。它是一个用现代C 编写的原位解析器&#xff0c;解析速度接近strlen在同一数据上执行的函数…

c++开源库rapidxml介绍与示例

官方地址&#xff1a;http://rapidxml.sourceforge.net/ 官方手册&#xff1a;http://rapidxml.sourceforge.net/manual.html 也可以在github上下载到别人上传的rapidxml:https://github.com/dwd/rapidxml 1.头文件 一般我们用到的头文件只有这三个 #include "rapidx…

Ubuntu 18.04 LDAP认证

将ubuntu配置为通过ldap认证&#xff0c;使其成为ldap client&#xff0c;系统版本ubuntu 18.04。 一 软件安装 apt-get install ldap-utils libpam-ldap libnss-ldap nslcd配置1 配置2 配置3 配置4 配置5 配置6 配置7 配置8 配置8 二 认证方式中添加Ldap #auth-client-conf…

LDAP认证服务器

1.要准备的环境与软件(这里测试环境是Centos6.0-64位系统) alfresco-community-4.2.c-installer-linux-x64.bin (注: alfresco是一个免费开源系统&#xff0c;可以自己去下载) apache-tomcat-7.0.42.tar db-4.5.20.tar jdk-6u45-linux-x64.bin openldap-stable-20100219.tar ph…

Jumpserver部署+Ldap认证

内容导航 &#xff08;一&#xff09;jumpserver快速部署1&#xff0c;部署内容2&#xff0c;附上安装脚本3&#xff0c;解决github无法连接4&#xff0c;修改配置 &#xff08;二&#xff09;使用jumpserver1&#xff0c;登录信息2&#xff0c;添加主机3&#xff0c;web终端登…

SVN使用LDAP认证

前言 SVN架构 用户访问SVN服务器分为两个部分&#xff1a;认证与授权。 SVN内置了有认证与授权机制&#xff0c;其认证是通过SVN仓库内的passwd文件提供&#xff0c;但它是明文、静态的&#xff0c;不方便且安全性低。 SVN还支持外部的认证&#xff0c;比如SASL&#xff0c;…

ldap 认证 java_Java实现LDAP认证(上)

Baidu脑残&#xff0c;把原来的空间改得不伦不类。所以把一些技术的东西挪到这里。 我找到两种方法&#xff0c;大同小异&#xff0c;第一种是通过Spring&#xff0c;适合已经采用Spring的项目。 一般来说用户名和密码都是保存在数据库中。现在有这个需求&#xff0c;用户名和密…

Harbor 整合ldap认证

前提&#xff1a; ldap服务器已经安装&#xff1a;OpenLDAP安装部署 harbor服务器已经安装&#xff1a;Harbro v1.8.0部署 一、ldap组织结构 1、登录信息 2、查看用户信息 二、harbor配置 1、使用默认密码登录&#xff0c;admin/Harbor12345 2、认证模式 3、测试ldap服务器…

ldap认证 java_Java实现LDAP认证(上) | 学步园

Baidu脑残&#xff0c;把原来的空间改得不伦不类。所以把一些技术的东西挪到这里。 我找到两种方法&#xff0c;大同小异&#xff0c;第一种是通过Spring&#xff0c;适合已经采用Spring的项目。 一般来说用户名和密码都是保存在数据库中。现在有这个需求&#xff0c;用户名和密…

Zabbix 整合ldap认证

前提&#xff1a; zabbix部署完成&#xff1a;CentOS7.3 64位&#xff0c;搭建Zabbix3.4 ldap部署完成&#xff1a;OpenLDAP安装部署 一、LDAP服务端 1、ldap登录信息 2、查看ldap组织架构 3、添加zabbix默认用户Admin 二、Zabbix网页端 1、使用zabbix默认管理员用户登录 …

linux+配置ldap认证,Linux LDAP 认证配置

Linux通过LDAP方式&#xff0c;使用windows AD帐户登录linux shell&#xff0c;这个想法很cool吧。之前配置过一次&#xff0c;但过了太久忘记了&#xff0c;因此&#xff0c;今天把配 Linux通过LDAP方式&#xff0c;使用windows AD帐户登录linux shell&#xff0c;这个想法很c…

JumpServer 整合ldap认证

前提&#xff1a; ldap服务器已经安装&#xff1a;OpenLDAP安装部署 一、JumpServer安装 官网安装地址安装部署 - JumpServer 文档 1、一键部署 #系统版本 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #默认会安装到 /opt/jumpser…

linux samba 配置ldap认证,Samba集成Ldap认证

Samba集成Ldap认证 1.基础安装 yum -y install samba-common samba samba-client smbldap-tools openldap-clients nss-pam-ldapd 2.配置authconfig-tui 执行命令 "authconfig-tui" 验证配置 # getent passwd zhangsan:x:6460:18650:zhangsan:/home/zhangsan:/bin/…

SVN集成LDAP认证

如何将 LDAP 的认证&#xff0c;集成到 SVN 中。集成的办法&#xff0c;目前是有两种&#xff1a;一种是 SVN 直接通过 SVN 端口直接访问的&#xff0c;通过 SASL 实现 LDAP 的认证&#xff1b;另一种是 SVN 通过 Apache 进行 HTTP 访问的用户&#xff0c;通过配置 Apache &…

zabbix配置ldap认证

zabbix配置ldap认证 环境&#xff1a; centos6.6 zabbix3.0.3 域控服务器&#xff1a;windows-active server 2008 需求&#xff1a; 公司越来越大&#xff0c;人越来越多&#xff0c;配置人员的账号密码很麻烦。 为了集中管理&#xff0c;整合公司的用户密码&#xff0c…