преобразовать строку в xml и обновить поле значения, используя boost - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть такая строка

> <?xml version="1.0" encoding="utf-8"?> <Parameters>
>     <Parameter id="ID_1" value="1"/>
>     <Parameter id="ID_2" value="000293604959"/>
>     <Parameter id="ID_3" value="MIIDzzCCAregAwIBAgIQBU7WUKqJI"/>          //Variable length data
>     <Parameter id="ID_4" value="MIIDyDCCArCgAwIBAgIGAWSjA2NaMA0GCSqGS"/>  //Variable length data
>     <Parameter id="ID_5" value="MIIDcDCCAligAwIBAgIEATMzfzANBgkqhk"/>     //Variable length data
>     <Parameter id="ID-6" value="WIN_10_64_bit"/> </Parameters>

И я хочу, чтобы это печаталось как (ожидаемый вывод) означает скрытие данных ID_3, ID_4 и ID_5.

> <?xml version="1.0" encoding="utf-8"?> <Parameters>
>     <Parameter id="ID_1" value="1"/>
>     <Parameter id="ID_2" value="000293604959"/>
>     <Parameter id="ID_3" value="Sensitive Data"/>         //Variable length data
>     <Parameter id="ID_4" value="Sensitive Data"/>         //Variable length data
>     <Parameter id="ID_5" value="Sensitive Data"/>         //Variable length data
>     <Parameter id="ID-6" value="WIN_10_64_bit"/>

До сих пор я пробовал это, но не повезло. Пожалуйста, дайте мне знать, где я делаю неправильно, чтобы обновить поле значения как реальное значение для чувствительных данных.

void hideData(string request)
{
stringstream ss;
ss.str(request);
boost::property_tree::ptree pt1;
boost::property_tree::read_xml(ss, pt1);
ostringstream oss;
string finalStringToPrint;

if (!pt1.empty())
{
    BOOST_FOREACH(boost::property_tree::ptree::value_type const& node, pt1.get_child("Parameters"))
    {
        if (node.first == "Parameter")
        {
            string id = node.second.get_child("<xmlattr>.id").data();
            if (id == "ID_3")
            {
                string value = node.second.get_child("<xmlattr>.value").data();
                value.erase();
                value.assign("Sensitive Data");
                pt1.put_value(value);
            }
            if (id == "ID_4")
            {
                string value = node.second.get_child("<xmlattr>.value").data();
                value.erase();
                value.assign("Sensitive Data");
                pt1.put_value(value);
            }
            if (id == "ID_5")
            {
                string value = node.second.get_child("<xmlattr>.value").data();
                value.erase();
                value.assign("Sensitive Data");
                pt1.put_value(value);
            }
        }
    }
}
boost::property_tree::write_xml(oss, pt1, boost::property_tree::xml_writer_make_settings<string>(' ', 4));
finalStringToPrint = oss.str();
cout << finalStringToPrint << endl;
}

1 Ответ

0 голосов
/ 09 апреля 2019

Вы хотите изменить данные в определенном узле, поэтому вызов get_child содержит ссылку на возвращенный дочерний узел, а затем вызовет put_value на этом узле:

            if (id == "ID_3")
            {
                auto& child = node.second.get_child("<xmlattr>.value");
                child.put_value("Sensitive Data");
            }
            if (id == "ID_4")
            {
                auto& child = node.second.get_child("<xmlattr>.value");
                child.put_value("Sensitive Data");
            }
            if (id == "ID_5")
            {
                auto& child = node.second.get_child("<xmlattr>.value");
                child.put_value("Sensitive Data");
            }

, и во время итерации вам нужноитерируйте элементы без const в foreach, поскольку вы изменяете элементы:

BOOST_FOREACH( boost::property_tree::ptree::value_type & node, pt1.get_child("Parameters"))

РЕДАКТИРОВАТЬ

Для удаления пробелов вы можете использовать property_tree::xml_parser::trim_whitespace в качестве ввода read_xml:

boost::property_tree::read_xml(ss, pt1, boost::property_tree::xml_parser::trim_whitespace);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...