c++ 使用RapidXML更新节点值

cgvd09ve  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(249)

我尝试使用RapidXML 1.13编辑节点的值,但未对.xml文件进行更改。
XML文件的简化版本如下所示:

  1. <users>
  2. <user>
  3. <username>test</username>
  4. <!-- This hazard line should change to "true" -->
  5. <hazards>false</hazards>
  6. <weather>false</weather>
  7. </user>
  8. </users>

字符串
我使用一个简单的for搜索所有用户,当找到匹配的用户时,我选择我感兴趣的属性并尝试修改其内容。

  1. rapidxml::file<> xmlFile("users.xml");
  2. rapidxml::xml_document<> doc;
  3. doc.parse<0>(xmlFile.data());
  4. for (rapidxml::xml_node<>* userNode = doc.first_node("users")->first_node("user"); userNode; userNode = userNode->next_sibling("user"))
  5. {
  6. rapidxml::xml_node<>* usernameNode = userNode->first_node("username");
  7. if (usernameNode && strcmp(usernameNode->value(), username) == 0)
  8. {
  9. rapidxml::xml_node<>* settingNode = userNode->first_node(setting.c_str());
  10. if (settingNode)
  11. {
  12. // Here's the problem
  13. settingNode->value(doc.allocate_string(boolToChar(value)));
  14. std::ofstream outFile("users.xml");
  15. outFile << doc;
  16. outFile.close();
  17. std::cout << settingNode->value() << std::endl;
  18. rapidxml::print(std::cout, doc, 0);
  19. return; // Don't keep the for running
  20. }
  21. }
  22. // Other edge cases...
  23. }


这一行std::cout << settingNode->value() << std::endl;打印“true”(正确的新值),但这一行rapidxml::print(std::cout, doc, 0);打印的是旧的、未更改的XML文件。因此,该值似乎被修改了,但从未保存到doc文件中。
我尝试创建一个节点的克隆,删除原来的并插入修改后的克隆,但出现了同样的问题:无法更改值。boolToChar()函数是正确的,当尝试使用allocate_string()到新生成的节点时,完全相同的方法有效。

已编辑

发现问题:这行settingNode->value(doc.allocate_string(boolToChar(value)));转换为settingNode->first_node()->value(doc.allocate_string(boolToChar(value)));。据我所知,节点内的文本也被认为是节点,从而解释了first_node()额外的调用。

juud5qan

juud5qan1#

这是一个基于模板的解决方案。一个模板就可以完成这项工作。
在c++中,几乎没有可用于编译的库。

输入XML

  1. <users>
  2. <user>
  3. <username>test</username>
  4. <hazards>false</hazards>
  5. <weather>false</weather>
  6. </user>
  7. </users>

字符串

价格1.0

  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0"
  3. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4. <xsl:output method="xml" omit-xml-declaration="yes"
  5. encoding="UTF-8" indent="yes"/>
  6. <xsl:strip-space elements="*"/>
  7. <!--Identity transform-->
  8. <xsl:template match="@*|node()">
  9. <xsl:copy>
  10. <xsl:apply-templates select="@*|node()"/>
  11. </xsl:copy>
  12. </xsl:template>
  13. <xsl:template match="hazards">
  14. <xsl:copy>
  15. <xsl:text>true</xsl:text>
  16. </xsl:copy>
  17. </xsl:template>
  18. </xsl:stylesheet>

输出XML

  1. <users>
  2. <user>
  3. <username>test</username>
  4. <hazards>true</hazards>
  5. <weather>false</weather>
  6. </user>
  7. </users>

展开查看全部

相关问题