簡體   English   中英

C ++ / RapidXML:編輯節點並寫入新的XML文件沒有更新的節點

[英]C++/RapidXML: Edit node and write to a new XML file doesn't have the updated nodes

我正在從string解析XML文件。 我的節點Idbar ,我想將其更改為foo ,然后寫入文件。

寫入文件后,文件仍然具有bar而不是foo

#include "rapidxml.hpp"
#include "rapidxml_print.hpp"
void main()
{
    std::string newXml = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?><Parent><FileId>fileID</FileId><IniVersion>2.0.0</IniVersion><Child><Id>bar</Id></Child></Parent>";

    xml_document<> doc;
    xml_node<> * root_node;

    std::string str = newXml;
    std::vector<char> buffer(str.begin(), str.end());
    buffer.push_back('\0');

    doc.parse<0>(&buffer[0]);

    root_node = doc.first_node("Parent");

    xml_node<> * node = root_node->first_node("Child");
    xml_node<> * xml = node->first_node("Id");
    xml->value("foo"); // I want to change my id from bar to foo!!!!

    std::ofstream outFile("output.xml");
    outFile << doc; // after I write to file, I still see the ID as bar
}

我在這里想念什么?

問題在於數據的布局。 node_element節點xml還有另一個node_data節點,它包含"bar" 您發布的代碼也不會編譯。 在這里,我使您的代碼得以編譯,並展示了如何修復它:

#include <vector>
#include <iostream>
#include "rapidxml.hpp"
#include "rapidxml_print.hpp"

int main()
{
    std::string newXml = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?><Parent><FileId>fileID</FileId><IniVersion>2.0.0</IniVersion><Child><Id>bar</Id></Child></Parent>";

    rapidxml::xml_document<> doc;

    std::string str = newXml;
    std::vector<char> buffer(str.begin(), str.end());
    buffer.push_back('\0');

    doc.parse<0>(&buffer[0]);

    rapidxml::xml_node<>* root_node = doc.first_node("Parent");

    rapidxml::xml_node<>* node = root_node->first_node("Child");
    rapidxml::xml_node<>* xml = node->first_node("Id");
    // xml->value("foo"); // does change something that isn't output!!!!

    rapidxml::xml_node<> *real_thing = xml->first_node();
    if (real_thing != nullptr                         // these checks just demonstrate that
       &&  real_thing->next_sibling() == nullptr      // it is there and how it is located
       && real_thing->type() == rapidxml::node_data)  // when element does contain text data 
    {
        real_thing->value("yuck");  // now that should work
    }

    std::cout << doc; // lets see it
}

因此它輸出:

<Parent>
    <FileId>fileID</FileId>
    <IniVersion>2.0.0</IniVersion>
    <Child>
        <Id>yuck</Id>
    </Child>
</Parent>

看到? 請注意,在解析期間如何布置數據取決於您要解析的標志。 例如,如果您首先放置doc.parse<rapidxml::parse_fastest>則解析器將不會創建此類node_data節點,然后更改node_element數據(如您初次嘗試的那樣)將起作用(而我在上面所做的操作則無效)。 閱讀手冊中的詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM