rapidxml 修改节点值

config.xml文件内容:

<cfg>
	<sys>
		<ip>192.168.1.22</ip>
		<netmask>255.255.0.0</netmask>
		<gateway>169.254.1.1</gateway>
		<mac>00:00:00:00:00:01</mac>
	</sys>
</cfg>

譬如现在要修改ip节点值为169.254.1.20,代码如下

#include <iostream>

#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"
int main(int argc,char **argv)
{
	rapidxml::file<> file("config.xml");
	rapidxml::xml_document<> doc;
	//doc.parse<0>(file.data());
	doc.parse<rapidxml::parse_no_data_nodes>(file.data());
	std::cout << doc.name() << std::endl;

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

	rapidxml::xml_node<> *node = root->first_node("sys");
	std::cout << node->name() << std::endl;
	//char *str  = doc.allocate_string("192.168.1.20");
	std::string str  = "169.254.1.20";
	node->first_node("ip")->value(str.c_str());
	std::cout << node->first_node("ip")->value() << std::endl;
	std::string text;
	rapidxml::print(std::back_inserter(text), doc, 0);
	std::cout << text << std::endl;
	std::ofstream out("config.xml");
	out << doc;
	return 0;
}

很多人在修改在序列化xml时用

doc.parse<0>(file.data());

这个是无法修改值的。必须使用如下

doc.parse<rapidxml::parse_no_data_nodes>(file.data());

具体参加如下描述

Question:

Printing a document having a node with a modified value yields the wrong output. Example:

xml_document<char> doc;
doc.parse<0>(doc.allocate_string("<test>old</test>"));
doc.first_node()->value(doc.allocate_string("new"));

rapidxml::print(cout, doc);

This will print "<test>old</test>" and not "<test>new</test>" as you would expect

Answer:

This is by design, although a little awkward.
The problem is that value of node is only a "shortcut" for the real data, which is stored in child data nodes of the node.

Child data nodes always take precedence over "value" of a node - to change the data you must do either one of the following:
- change the data in child data node(s), not in the value of parent node
- tell parser that you do not want to have data nodes generated (parse_no_data_nodes), in which case you can just change the value

相关连接:

http://sourceforge.net/p/rapidxml/bugs/3/

http://www.setnode.com/blog/quick-notes-on-how-to-use-rapidxml/

http://stackoverflow.com/questions/15054771/c-rapidxml-edit-values-in-the-xml-file

时间: 2024-10-13 14:17:53

rapidxml 修改节点值的相关文章

rapidxml修改节点的值

1.rapidxml修改节点的value,修改之后,序列化还是原来的值,具体原因是什么,要看rapidxml是怎么实现的.如下: void TestRapidXml() { char* xmlContent = new char[1024]; sprintf(xmlContent,"<root><head>aaa</head><body x=\"10\">bbb</body></root>");

C# 如何获取自定义的config中节点的值,并修改节点的值

现定义一个方法 DIYConfigHelper.cs using System; using System.Xml; using System.Configuration; using System.Reflection; using System.Web; using System.IO; namespace Chain.Common { /// <summary> /// Summary description for ReadWriteConfig. /// </summary&g

JavaScript之DOM-2 读取和修改节点信息(节点信息、元素的内容、属性)

一.节点信息 节点名称 nodeName - nodeName: 节点的名称,String 类型属性 - nodeName 是只读的 节点类型 nodeType - nodeType:节点类型,Number 类型属性 节点值 nodeValue - nodeValue:节点的值,String类型属性 二.元素的内容 HTML 内容 - 元素节点对象的innerHTML属性读取或设置元素节点中的HTML内容 文本内容 - 元素节点对象的textContent属性用于读取或设置元素节点中的文本内容-

js 动态修改属性值 动态修改图片,字等

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"   http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv = "content-type" content="text/html;charset=utf-8"/> &

selenium处理富文本框,日历控件等 调用JS修改value值

http://blog.csdn.net/fudax/article/details/8089404 document.getElementById("js_domestic_fromdate").value = "2014-10-10" selenium处理富文本框,日历控件等 调用JS修改value值,布布扣,bubuko.com

jQuery attr方法修改onclick值

了通过jQuery的attr修改onclick值. 代码: var js = "alert('B:' + this.id); return false;"; var newclick = eval("(function(){"+js+"});"); $("#anchor").attr('onclick', '').click(newclick); 如果onclick事件原先有值,要先清空,再用click( eval(funct

CentOS7/RHEL7如何修改swappiness值?

示例:修改swappiness值为0 永久配置方法: sysctl -w vm.swappiness=0 echo vm.swappiness = 0 >> /etc/sysctl.conf 临时配置方法: sysctl -w vm.swappiness=0 手动更改/sys/fs/cgroup/memory下子目录对应的memory.swappiness值 临时配置后可能出现的故障描述: 物理内存还比较充足,vm.swappiness已经设置为0,但系统还是用了swap分区 故障原因 根因是

设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先

思想:采用非递归后序遍历二叉树b.当找到节点值为x的节点时将栈中所有节点值存放在anorx数组中(如图所示的二叉树,F节点的anorx为"ACF"),当找到节点值为y的节点时将栈中所有节点值存放在anory数组中(对于如图所示的二叉树,E节点的anory为"ACE"),当两个节点均已找到后,通过比较找到他们最近的公共祖先(对于如图所示的二叉树,F和E节点的最近公共祖先为C),对应的算法如下: int commancestor(BTNode *b,ElementTyp

SQL两表关联查询&批量修改字段值

SQL关联查询&修改字段,正确范例如下: --批量修改报告单位名称&更新时间 --tt和tp两表关联查询,将符合条件的tt表中的principal字段更新到tp表的ruperson字段 merge into nhis34.t_publicplaces tp using standard.t_organization tt on (tt.orgcode = tp.r_orgcode and tp.create_time > '2015-05-07 00:00:00') when mat