rapidxml修改节点的值
1、rapidxml修改节点的value,修改之后,序列化还是原来的值,具体原因是什么,要看rapidxml是怎么实现的。如下:
void TestRapidXml()
{
char* xmlContent = new char[];
sprintf(xmlContent,"<root><head>aaa</head><body x=\"10\">bbb</body></root>"); xml_document<> xmlDoc;
xmlDoc.parse<>(xmlContent); xml_node<>* body = xmlDoc.first_node()->first_node("body");
body->value("ccc"); xml_attribute<>* x = body->first_attribute("x");
x->value(""); string xmlStr = "";
// xmlString为 <root><head>aaa</head><body x=\"20\">bbb</body></root>
// 也就是说,attr的value可以修改成功,而node的value还是旧值。
rapidxml::print(std::back_inserter(xmlStr),xmlDoc,); delete []xmlContent;
}
2、怎么解决上面的问题,笨办法,既然不能修改,我就添加一个新的,删除老的。如下:
void TestRapidXml()
{
char* xmlContent = new char[];
sprintf(xmlContent,"<root><head>aaa</head><body x=\"10\">bbb</body></root>"); xml_document<> xmlDoc;
xmlDoc.parse<>(xmlContent); xml_node<>* root = xmlDoc.first_node(); xml_node<>* body = root->first_node("body");
xml_node<>* newBody = xmlDoc.allocate_node(node_element,
xmlDoc.allocate_string("body"),xmlDoc.allocate_string("ccc"));
// 插入一个新的body
root->insert_node(body,newBody); // 复制老body的attr
for(xml_attribute<>* attr = body->first_attribute();attr!=NULL;attr=attr->next_attribute())
{
xml_attribute<>* copy = xmlDoc.allocate_attribute(xmlDoc.allocate_string(attr->name()),
xmlDoc.allocate_string(xmlDoc.allocate_string(attr->value())));
newBody->append_attribute(copy);
}
// 删除老的body
root->remove_node(body); string xmlStr = "";
// xmlString为 <root><head>aaa</head><body x=\"10\">ccc</body></root>
rapidxml::print(std::back_inserter(xmlStr),xmlDoc,); delete []xmlContent;
}
3、还有一个办法,就是使用 xmlDoc.parse<parse_no_data_nodes>(xmlContent); 如下:
void TestRapidXml()
{
char* xmlContent = new char[];
sprintf(xmlContent,"<root><head>aaa</head><body x=\"10\">bbb</body></root>"); xml_document<> xmlDoc;
//xmlDoc.parse<0>(xmlContent);
xmlDoc.parse<parse_no_data_nodes>(xmlContent); xml_node<>* body = xmlDoc.first_node()->first_node("body");
body->value("ccc"); xml_attribute<>* x = body->first_attribute("x");
x->value(""); string xmlStr = "";
// xmlString为 <root><head>aaa</head><body x=\"20\">ccc</body></root>
rapidxml::print(std::back_inserter(xmlStr),xmlDoc,); delete []xmlContent;
}
rapidxml修改节点的值的更多相关文章
- C# 如何获取自定义的config中节点的值,并修改节点的值
现定义一个方法 DIYConfigHelper.cs using System; using System.Xml; using System.Configuration; using System. ...
- c# winform TreeView NODE(节点) 重命名或获取节点修改后的值
在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...
- rapidxml 解析修改内存的值
1.使用rapidxml解析的时候,也就是 调用xmlDoc.parse<0>(xmlContent),特别注意,rapidxml会修改内存的值,把右尖括号>修改为'\0',因此特别 ...
- 使用DOM解析XML文件,、读取xml文件、保存xml、增加节点、修改节点属性、删除节点
使用的xml文件 <?xml version="1.0" encoding="GB2312" ?> <PhoneInfo> <Br ...
- java操作xml文件--修改节点
上一篇文章我介绍了SAX方法解析XML文件的过程,这篇文章讲解的内容是利用DOM方法修改XML文件的节点内容. 下面依然是首先贴出XML文件: <?xml version ...
- C# xml 读xml、写xml、Xpath、Xml to Linq、xml添加节点 xml修改节点
#region XDocument //创建XDocument XDocument xdoc2 = new XDocument(); XElement xel1= new XElement(" ...
- c#操作xml的代码(插入节点、修改节点、删除节点等)
bookstore.xml文件内容: 复制代码代码示例: <?xml version="1.0" encoding="gb2312"?><bo ...
- 用TinyXml做XML解析示例 TinyXml查找唯一节点及修改节点操作
// 读者对象:对TinyXml有一定了解的人.本文是对TinyXml工具的一些知识点的理解. // 1 TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的. // enum No ...
- 剑指offer3:从尾到头打印链表每个节点的值
1. 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 2. 思路和方法 2.1 推荐的方法 (1)栈,循环 后进先出,我们可以用栈实现这种顺序.每经过一个结点的时候,把该节点放到一个栈里面,当 ...
随机推荐
- 【20181102T1】优美的序列【二分+ST表】
题面 [正解] 相当于是 \(GCD_{i=L}^{R} A_i = min_{i=L}^{R} \{A_i\}\) 然后GCD可以用ST表实现\(O(log A_i)\)查询 并且GCD是递减的,所 ...
- Codeforces Round #359 (Div. 1) A. Robbers' watch 暴力
A. Robbers' watch 题目连接: http://www.codeforces.com/contest/685/problem/A Description Robbers, who att ...
- ZOJ 3626 Treasure Hunt I 树上DP
E - Treasure Hunt I Time Limit:2000MS Memory Limit:65536KB Description Akiba is a dangerous country ...
- brainfuck 解释器
#include <cstdio>#include <cmath>#include <cstring>#include <ctime>#include ...
- 《学习OpenCv》 笔记(1)
P1-P17 废话 可跳过 不过讲了如何搭建环境,如果你没有搭建的话,可以查看我的另外一个博文,详细讲了如何构建OpenCv的编程环境 P19 开始编写第一个代码
- HTML的各个标签的默认样式
head{ display: none } body{ margin: 8px;line-height: 1.12 } button, textarea,input, object,select { ...
- vue父子组件使用时遇到的一个问题
子组件一定要写在父组件之前,例如: //子vue,这里遇到一个坑,那就是子vue一定要写在父vue前面,不然会报错. Vue.component('todo-item', { template: $( ...
- Linux给目录创建软链接的技巧
ln -s /home/fei/workspace /var/www 注意:源目录和目标目录都必须是绝对路径
- Send a WhatsApp Message programatically -- Tasker WhatsTasker
Here is My code snippet: Uri mUri = Uri.parse("smsto:+9876543210"); Intent mIntent = new I ...
- Visual Studio中Debug和Release的区别
在Visual Studio中,生成应用程序的时候有2种模式:Debug和Release.两者之间如何取舍呢? 假设有这么简单的一段代码,在主程序中调用方法M1,M1方法调用M2方法,M2方法调用M3 ...