首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RapidXML更新C++中的XML节点和属性值

使用RapidXML更新C++中的XML节点和属性值
EN

Stack Overflow用户
提问于 2018-10-14 12:09:07
回答 1查看 681关注 0票数 0

我有一个XML文件,用于存储相机参数,这些参数将根据UI的变化进行更新。使用RapidXML,我可以读取XML文件、所有元素及其属性值。但是,当我尝试更新属性/元素的值并保存它时,文件不会反映新值,但会显示旧值。我尝试在一个很小的XML文件上测试这个概念,如下所示

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<note>
    <to>Kum</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Dont forget me this weekend!</body>
</note>

这只是一个没有attributes>的简单示例文件,这是我拥有的代码。

代码语言:javascript
复制
rapidxml::xml_document<> doc;
std::fstream file("TestFile.xml",std::ios::in|std::ios::out);

std::stringstream bufferStream;
bufferStream << file.rdbuf();
std::string content(bufferStream.str());
std::vector<char> buffer(content.begin(), content.end());
buffer.push_back('\0');
doc.parse<rapidxml::parse_no_data_nodes>(&content[0]);

rapidxml::xml_node<>* rootNode = doc.first_node();
std::cout <<"<"<< rootNode->name() <<">" << "\n";
rapidxml::xml_node<>* firstNode = rootNode->first_node("to");
std::cout << "<"<<firstNode->name()<<">" <<firstNode->value()<< "\n";

rapidxml::xml_node<> *real_thing = rootNode->first_node("from");

if (real_thing != nullptr)                              
{
    real_thing->value("yuck");  // now that should work
    std::cout << real_thing->name() << real_thing->value() << "\n";
}

这就是我感到困惑的地方。如何将此更改保存回原始xml文件。如果我这么做了

代码语言:javascript
复制
file << bufferStream.str();

它不仅不保存新的值,而且似乎附加了整个XML DOM,而不是替换原始的元素值。如果有人能分享一些关于如何实现这一目标的小片段,我将不胜感激。我花了一整天的时间浏览文档,但也不理解传递给parse函数的标志。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-10-16 21:11:33

RapidXML保存文档结构的内部表示,使用指向传递给parsestd::vector<char>中保存的文本数据的指针。

代码语言:javascript
复制
file << doc;

它为什么要追加?因为在读取数据之后,流的位置在文件的末尾。您可以使用file.seek(0)重置到开头,但如果新数据比旧数据短,这不会截断文件。

最好的方法是简单地将数据写出到新的fstream,而不是尝试打开一个来同时读写。

另请参阅此处,了解使用RapidXML解析文件的一些更整洁、更快速的方法。How to parse the XML file in RapidXML

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52799390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档