увеличить дерево свойств add_child, указав путь

Я использую boost :: property_tree для манипулирования некоторыми XML. Я должен добавить подузел в документ XML

XML-документ выглядит так:

<MPD>
<Period>
<AdaptationSet mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"/>
<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<!-- value already exists here //-->
<!-- need to insert new entry here //-->
</ContentProtection>
</AdaptationSet>

<AdaptationSet>
<ContentProtection ... />
<ContentProtection ... />
<ContentProtection ... />
</AdaptationSet>
</Period>
</MPD>

Таким образом, у меня есть следующий код для вставки новой записи в месте, отмеченном в XML выше:

typedef boost::property_tree::iptree        property_tree_t;
typedef boost::shared_ptr<property_tree_t>  shared_ptree_t;
typedef boost::optional<property_tree_t &>  optional_ptree_t;

string sSearchSchemeIdUri = "urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95";
string sChildName;

optional_ptree_t spPeriod = spPTree->get_child_optional("MPD.Period");
if (spPeriod)
{
for (auto & adaptSetNextChild : spPeriod->get_child("AdaptationSet"))
{
sChildName = adaptSetNextChild.first;

if (sChildName.compare("ContentProtection") == 0)
{
property_tree_t &   ptContentProtection = adaptSetNextChild.second;
string              sSchemeIdUri        = ptContentProtection.get<string>("<xmlattr>.schemeIdUri", "");

if (sSchemeIdUri.compare(sSearchSchemeIdUri) == 0)
{
property_tree_t ptPssh;
ptPssh.clear();
ptPssh.add("cenc:PSSH", sPssh);
ptContentProtection.add_child("./", ptPssh);
}
}
}
}

Приведенный выше код переносит добавленные данные в следующее:

<></>
<//></>

Которого я бы хотел избежать.

Эта ошибочная разметка прибывает, я предполагаю от моего вызова add_child, который определяет путь вставки как «./»

Указание ничего не вызывает исключения, и это единственное, что я нашел, что работает.

Прочитав заголовочный файл для ptree.hpр, который утверждает, что аргумент

/** Add the node at the given path. Create any missing parents. If there
* already is a node at the path, add another one with the same key.
* @param path Path to the child. The last fragment must not have an
*             index.
* @return A reference to the inserted subtree.
* @note Because of the way paths work, it is not generally guaranteed
*       that a node newly created can be accessed using the same path.
*/
self_type &add_child(const path_type &path, const self_type &value);

Есть ли способ указать текущий путь, например. путь для ptContentProtection?

1

Решение

Вы, вероятно, хотите иметь put члены вместо add члены.

Вот образец, который заменяет OLD VALUE с NEW VALUE:

Жить на Колиру

#include <boost/property_tree/xml_parser.hpp>
#include <iostream>

static std::string const sample = R"(<MPD>
<Period>
<AdaptationSet mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc"/>
<ContentProtection schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">OLD VALUE</ContentProtection>
</AdaptationSet>

<AdaptationSet>
</AdaptationSet>
</Period>
</MPD>)";

static std::string sSearchSchemeIdUri = "urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95";

int main() {
using boost::property_tree::iptree;
iptree pt;
{
std::istringstream iss(sample);
read_xml(iss, pt);
}

for (auto& as : pt.get_child("MPD.Period")) {
if (as.first == "AdaptationSet") {
for (auto& cp : as.second) {
if (cp.first == "ContentProtection" && cp.second.get("<xmlattr>.schemeIdUri", "") == sSearchSchemeIdUri)
{
cp.second.put_value("NEW VALUE");
}
}
}
}

auto xws = boost::property_tree::xml_writer_make_settings<std::string>(' ', 4);
write_xml(std::cout, pt, xws);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]