rapidxml修改节点的值

1、rapidxml修改节点的value,修改之后,序列化还是原来的值,具体原因是什么,要看rapidxml是怎么实现的。如下:

void TestRapidXml() { char* xmlContent = new char[1024]; sprintf(xmlContent,"<root><head>aaa</head><body x=\"10\">bbb</body></root>"); xml_document<> xmlDoc; xmlDoc.parse<0>(xmlContent); xml_node<>* body = xmlDoc.first_node()->first_node("body"); body->value("ccc"); xml_attribute<>* x = body->first_attribute("x"); x->value("20"); string xmlStr = ""; // xmlString为 <root><head>aaa</head><body x=\"20\">bbb</body></root> // 也就是说,attr的value可以修改成功,而node的value还是旧值。
    rapidxml::print(std::back_inserter(xmlStr),xmlDoc,0); delete []xmlContent; }

2、怎么解决上面的问题,笨办法,既然不能修改,我就添加一个新的,删除老的。如下:

void TestRapidXml() { char* xmlContent = new char[1024]; sprintf(xmlContent,"<root><head>aaa</head><body x=\"10\">bbb</body></root>"); xml_document<> xmlDoc; xmlDoc.parse<0>(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,0); delete []xmlContent; }

3、还有一个办法,就是使用 xmlDoc.parse<parse_no_data_nodes>(xmlContent); 如下:

void TestRapidXml() { char* xmlContent = new char[1024]; 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("20"); string xmlStr = ""; // xmlString为 <root><head>aaa</head><body x=\"20\">ccc</body></root>
    rapidxml::print(std::back_inserter(xmlStr),xmlDoc,0); delete []xmlContent; }

 

你可能感兴趣的:(xml)