RapidXml使用方法

RapidXml使用方法一、写xml文件#include#include”rapidxml/rapidxml.hpp”#include”rapidxml/rapidxml_utils.hpp”#include”rapidxml/rapidxml_print.hpp”usingnamespacerapidxml;intmain(){ xml_document<>doc;

大家好,又见面了,我是你们的朋友全栈君。

一、写xml 文件

#include <iostream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"

using namespace rapidxml;

int main()
{    
	xml_document<> doc;  
	xml_node<>* rot = doc.allocate_node(rapidxml::node_pi,doc.allocate_string("xml version='1.0' encoding='utf-8'"));
	doc.append_node(rot);
	xml_node<>* node =   doc.allocate_node(node_element,"config","information");  
	xml_node<>* color =   doc.allocate_node(node_element,"color",NULL);  
	doc.append_node(node);
	node->append_node(color);
	color->append_node(doc.allocate_node(node_element,"red","0.1"));
	color->append_node(doc.allocate_node(node_element,"green","0.1"));
	color->append_node(doc.allocate_node(node_element,"blue","0.1"));
	color->append_node(doc.allocate_node(node_element,"alpha","1.0"));

	xml_node<>* size =   doc.allocate_node(node_element,"size",NULL); 
	size->append_node(doc.allocate_node(node_element,"x","640"));
	size->append_node(doc.allocate_node(node_element,"y","480"));
	node->append_node(size);

	xml_node<>* mode = doc.allocate_node(rapidxml::node_element,"mode","screen mode");
	mode->append_attribute(doc.allocate_attribute("fullscreen","false"));
	node->append_node(mode);

	std::string text;  
	rapidxml::print(std::back_inserter(text), doc, 0);  

	std::cout<<text<<std::endl; 

	std::ofstream out("config.xml");
	out << doc;

	system("PAUSE");
	return EXIT_SUCCESS;
}

生成的xml如下

  <?xml version="1.0" encoding="utf-8" ?> 
- <config>
- <color>
  <red>0.1</red> 
  <green>0.1</green> 
  <blue>0.1</blue> 
  <alpha>1.0</alpha> 
  </color>
- <size>
  <x>640</x> 
  <y>480</y> 
  </size>
  <mode fullscreen="false">screen mode</mode> 
  </config>

写文件例子2:

#include <string>
#include <iostream>
#include <fstream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"


using namespace rapidxml;
using namespace std;

int main(int argc, char* argv[])
{

    xml_document<> doc; //是解析器
    char a[] = "<top>"//如果单独传, 就不能加上xml的头部信息,
               //否则会报错
               "<name>tangqiang</name>"
               "<age>22</age>"
               "</top>";
    char* p = a;
    doc.parse<0>(p);

    xml_node<>* node = doc.first_node();//去顶级结点
    cout << (node->name())<< endl;
    node = node->first_node();
    while (node) {
        cout << node->name() << node->value() << endl;//name() value()返回的字符串不会去掉首尾的空白字符
        node = node->next_sibling();
    }

    ofstream out("test.xml");//ofstream 默认时,如果文件存在则会覆盖原来的内容,不存在则会新建
    out << doc;//doc 这样输出时在目标文件中不会有xml 头信息---<?xml version='1.0' encoding='utf-8' >
    out.close();
	system("pause");
    return 0;
}

生成的xml如下

<top>
	<name>tangqiang</name>
	<age>22</age>
</top>

二、读取xml文件

#include <iostream>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"

using namespace rapidxml;

int main()
{
    file<> fdoc("config.xml");
    std::cout<<fdoc.data()<<std::endl;
    xml_document<>   doc;
    doc.parse<0>(fdoc.data());

    std::cout<<doc.name()<<std::endl;

    //! 获取根节点
    xml_node<>* root = doc.first_node();
    std::cout<<root->name()<<std::endl;

    //! 获取根节点第一个节点
    xml_node<>* node1 = root->first_node();
    std::cout<<node1->name()<<std::endl;

    xml_node<>* node11 = node1->first_node();
    std::cout<<node11->name()<<std::endl;
    std::cout<<node11->value()<<std::endl;

    //! 添加之后再次保存
    //需要说明的是rapidxml明显有一个bug
//那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
    xml_node<>* size = root->first_node("size");
    size->append_node(doc.allocate_node(node_element,"w","0"));
    size->append_node(doc.allocate_node(node_element,"h","0"));

    std::string text;
    rapidxml::print(std::back_inserter(text),doc,0);

    std::cout<<text<<std::endl;

    std::ofstream out("config.xml");
    out << doc;

    system("PAUSE");
    return EXIT_SUCCESS;
}

生成的xml为

<config>
	<color>
		<red>0.1</red>
		<green>0.1</green>
		<blue>0.1</blue>
		<alpha>1.0</alpha>
	</color>
	<size>
		<x>640</x>
		<y>480</y>
		<w>0</w>
		<h>0</h>
	</size>
	<mode fullscreen="false">screen mode</mode>
</config>

三、删除节点

#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"

#include<iostream>
using namespace rapidxml;

int main()
{
	file<> fdoc("config.xml");
	xml_document<> doc;
	doc.parse<0>(fdoc.data());

	std::string text;  
	rapidxml::print(std::back_inserter(text), doc, 0);  
	std::cout<<text<<std::endl; 

	xml_node<>* root = doc.first_node();

	xml_node<>* sec = root->first_node();

	root->remove_node(sec); //移除根节点下的sec结点(包括该结点下所有结点)
	text="删除一个节点\r\n";  
	rapidxml::print(std::back_inserter(text), doc, 0);  
	std::cout<<text<<std::endl; 

	root->remove_all_nodes(); //移除根节点下所有结点
	text="删除所有节点\r\n";  
	rapidxml::print(std::back_inserter(text), doc, 0);  
	std::cout<<text<<std::endl; 

	std::ofstream out("test.xml");
	out<<doc;
	system("pause");
	return 0;
}

输出信息如下:

<config>
	<color>
		<red>0.1</red>
		<green>0.1</green>
		<blue>0.1</blue>
		<alpha>1.0</alpha>
	</color>
	<size>
		<x>640</x>
		<y>480</y>
		<w>0</w>
		<h>0</h>
	</size>
	<mode fullscreen="false">screen mode</mode>
</config>


删除一个节点

<config>
	<size>
		<x>640</x>
		<y>480</y>
		<w>0</w>
		<h>0</h>
	</size>
	<mode fullscreen="false">screen mode</mode>
</config>


删除所有节点

<config/>

四、编辑节点信息

暂时找到的编辑方法就是先删除再增加

#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"

#include<iostream>
using namespace rapidxml;

int main()
{
	file<> fdoc("config.xml");
	std::cout<<fdoc.data()<<std::endl;
	xml_document<> doc;
	doc.parse<0>(fdoc.data());

	std::cout<<doc.name()<<std::endl;

	//! 获取根节点
	xml_node<>* root = doc.first_node();
	xml_node<>* delnode = root->first_node("color");
	root->remove_node(delnode);//先删除address节点
	//
	xml_node<>* lnode = root->first_node("size");//找到post节点
	xml_node<>* mynode=doc.allocate_node(node_element,"address","河北");
	root->insert_node(lnode,mynode);

	std::string text;
	rapidxml::print(std::back_inserter(text),doc,0);


	std::cout<<text<<std::endl;

	std::ofstream out("version.xml");
	out << doc;
	system("pause");
	return 0;   
}

输出如下:

<config>

	<color>

		<red>0.1</red>

		<green>0.1</green>

		<blue>0.1</blue>

		<alpha>1.0</alpha>

	</color>

	<size>

		<x>640</x>

		<y>480</y>

		<w>0</w>

		<h>0</h>

	</size>

	<mode fullscreen="false">screen mode</mode>

</config>





<config>
	<address>河北</address>
	<size>
		<x>640</x>
		<y>480</y>
		<w>0</w>
		<h>0</h>
	</size>
	<mode fullscreen="false">screen mode</mode>
</config>

五、遍历所有节点

for(rapidxml::xml_node<char> * node = parent_node->first_node("node name");
    node != NULL;
    node = node->next_sibling())
{
    ...
}

六、遍历所有属性

for(rapidxml::xml_attribute<char> * attr = node->first_attribute("node name");
    attr != NULL;
    attr = attr->next_attribute())
{
    char * value = attr->value();
}

七、gcc使用-std=gnu++0x 编译rapidxml时会报错,错误信息大概如下

…rapidxml_print.hpp:120:23: error:

call to function ‘print_element_node’ thatis neither visible in the

template definition nor found byargument-dependent lookup

out = print_element_node(out, node, flags,indent);

^

…rapidxml_print.hpp:242:22: note:

‘print_element_node’ should be declaredprior to the call site or in

namespace ‘rapidxml’

inline OutIt print_element_node(OutIt out,const xml_node<Ch> …

在这里找到了解决方法。

经查,原来print_node()函数被其他函数调用,但在却未定义(在被调用函数后定义了),所以解决方法为把print_node()函数移到print_children(), print_element_node() 等函数的后面。在原定义处就留一个函数声明就行。

具体diff文件如下。

Index: rapidxml_print.hpp
===================================================================
--- rapidxml_print.hpp	(revision 2025)
+++ rapidxml_print.hpp	(revision 2080)
@@ -101,68 +101,9 @@
 
         ///
         // Internal printing operations
-    
-        // Print node
+        
         template<class OutIt, class Ch>
-        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
-        {
-            // Print proper node type
-            switch (node->type())
-            {
-
-            // Document
-            case node_document:
-                out = print_children(out, node, flags, indent);
-                break;
-
-            // Element
-            case node_element:
-                out = print_element_node(out, node, flags, indent);
-                break;
-            
-            // Data
-            case node_data:
-                out = print_data_node(out, node, flags, indent);
-                break;
-            
-            // CDATA
-            case node_cdata:
-                out = print_cdata_node(out, node, flags, indent);
-                break;
-
-            // Declaration
-            case node_declaration:
-                out = print_declaration_node(out, node, flags, indent);
-                break;
-
-            // Comment
-            case node_comment:
-                out = print_comment_node(out, node, flags, indent);
-                break;
-            
-            // Doctype
-            case node_doctype:
-                out = print_doctype_node(out, node, flags, indent);
-                break;
-
-            // Pi
-            case node_pi:
-                out = print_pi_node(out, node, flags, indent);
-                break;
-
-                // Unknown
-            default:
-                assert(0);
-                break;
-            }
-            
-            // If indenting not disabled, add line break after node
-            if (!(flags & print_no_indenting))
-                *out = Ch('\n'), ++out;
-
-            // Return modified iterator
-            return out;
-        }
+        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);        
         
         // Print children of the node                               
         template<class OutIt, class Ch>
@@ -372,7 +313,69 @@
             *out = Ch('>'), ++out;
             return out;
         }
+        
+        // Print node
+        template<class OutIt, class Ch>
+        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
+        {
+            // Print proper node type
+            switch (node->type())
+            {
 
+            // Document
+            case node_document:
+                out = print_children(out, node, flags, indent);
+                break;
+
+            // Element
+            case node_element:
+                out = print_element_node(out, node, flags, indent);
+                break;
+            
+            // Data
+            case node_data:
+                out = print_data_node(out, node, flags, indent);
+                break;
+            
+            // CDATA
+            case node_cdata:
+                out = print_cdata_node(out, node, flags, indent);
+                break;
+
+            // Declaration
+            case node_declaration:
+                out = print_declaration_node(out, node, flags, indent);
+                break;
+
+            // Comment
+            case node_comment:
+                out = print_comment_node(out, node, flags, indent);
+                break;
+            
+            // Doctype
+            case node_doctype:
+                out = print_doctype_node(out, node, flags, indent);
+                break;
+
+            // Pi
+            case node_pi:
+                out = print_pi_node(out, node, flags, indent);
+                break;
+
+                // Unknown
+            default:
+                assert(0);
+                break;
+            }
+            
+            // If indenting not disabled, add line break after node
+            if (!(flags & print_no_indenting))
+                *out = Ch('\n'), ++out;
+
+            // Return modified iterator
+            return out;
+        }        
+
     }
     //! \endcond
 

八、判断解析能否成功

</pre><pre name="code" class="cpp">    try {
        doc.parse<0>((char*)tmpbuf);//会改变参数的内容,tmpbuf的生命周期必须到解析完
    } catch (rapidxml::parse_error &e) {
        err="parse xml error. ";
        err+=e.what();
		delete []tmpbuf;
		return s_stl_ruleinfo;
    }

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160881.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oraclesql拼接字符串_java拼接多个字符串

    oraclesql拼接字符串_java拼接多个字符串createorreplaceprocedureproc_query_prior_departmentisCursordepartment_list_nosubisselectdep.id,dep.name,dep.parencreateorreplaceprocedureproc_query_prior_departmentisCursordepartment_list_…

    2025年11月12日
    6
  • ldd 和ldconfig

    ldd 和ldconfig一、ldconfigldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig。ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连

    2022年6月11日
    54
  • idea2021.8激活码[免费获取]

    (idea2021.8激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~BI…

    2022年3月22日
    72
  • 华三交换机配置access命令_H3C交换机配置基本命令详解

    华三交换机配置access命令_H3C交换机配置基本命令详解H3C交换机配置基本命令详解随着移动互联网趋势加快以及智能终端的快速普及,WLAN应用需求在全球保持高速增长态势。下面是小编整理的关于H3C交换机配置基本命令详解,希望大家认真阅读!1、配置主机名[H3C]systemnameH3C2、配置console口密码#进入系统视图。system-view#进入AUX用户界面视图。[H3C]user-interfaceaux0#设置通过Con…

    2022年6月20日
    198
  • 具体说明 Flume介绍、安装和配置

    具体说明 Flume介绍、安装和配置

    2022年1月6日
    47
  • L2正则化的作用(l1正则化特点)

    0正则化的作用正则化的主要作用是防止过拟合,对模型添加正则化项可以限制模型的复杂度,使得模型在复杂度和性能达到平衡。常用的正则化方法有L1正则化和L2正则化。L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归。但是使用正则化来防止过拟合的原理是什么?L1和L…

    2022年4月11日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号