c++ 使用RapidXML更新节点值

cgvd09ve  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(174)

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

<users>
    <user>
        <username>test</username>
        <!-- This hazard line should change to "true" -->
        <hazards>false</hazards>
        <weather>false</weather>
    </user>
</users>

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

rapidxml::file<> xmlFile("users.xml");
rapidxml::xml_document<> doc;
doc.parse<0>(xmlFile.data());

for (rapidxml::xml_node<>* userNode = doc.first_node("users")->first_node("user"); userNode; userNode = userNode->next_sibling("user")) 
{
    rapidxml::xml_node<>* usernameNode = userNode->first_node("username");
    if (usernameNode && strcmp(usernameNode->value(), username) == 0) 
    {
        rapidxml::xml_node<>* settingNode = userNode->first_node(setting.c_str());
        if (settingNode)
        {
            // Here's the problem
            settingNode->value(doc.allocate_string(boolToChar(value)));
            std::ofstream outFile("users.xml");
            outFile << doc;
            outFile.close();
    
            std::cout << settingNode->value() << std::endl;
            rapidxml::print(std::cout, doc, 0);
            return; // Don't keep the for running
        }
    }                
    // Other edge cases...
}


这一行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

<users>
    <user>
        <username>test</username>
        <hazards>false</hazards>
        <weather>false</weather>
    </user>
</users>

字符串

价格1.0

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"
                encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!--Identity transform-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="hazards">
        <xsl:copy>
            <xsl:text>true</xsl:text>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出XML

<users>
  <user>
    <username>test</username>
    <hazards>true</hazards>
    <weather>false</weather>
  </user>
</users>

相关问题