Добавить XML, содержащийся в строке, как XML узлы к существующему дереву pugi xml - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть файл конфигурации заставки / загрузчик. В дополнение к ожидаемым данным есть узел <CustomData>. При сохранении узла мы просто добавили бы std::string _customData и добавили бы его в узел, например:

  pugi::xml_document doc;
  pugi::xml_node config = doc.append_child("OurConfig");

  // save custom data
  pugi::xml_node customData = config.append_child("CustomData");
  customData.append_child(pugi::node_pcdata).set_value(_customData);

Наш _customData был закодирован в base64 XML. Он предоставляется из другой части приложения. Это должна быть строка, так как другая часть приложения использует другой язык программирования (C#). Как вы можете себе представить, это стало раздражать, потому что это не было читаемым человеком. Первым шагом к решению этой проблемы было просто избавиться от base64 в приложении, которое предоставляет _customData. Итак, теперь у нас есть читаемая версия, которая выглядит следующим образом:

    <?xml version="1.0"?>
    <OurConfig>
        <CustomData>&lt;CfgRoot&gt;
&lt;SomeValue name="External setting for foo" value="Foo"/&gt;
&lt;SomeValue name="External setting for bar" value="Bar"/&gt;
&lt;/CfgRoot&gt;</CustomData>
    </OurConfig>

Но, возможно, она может улучшиться, если пользовательские данные будут напрямую добавлены в дерево XML вместо строкового значения. Как я могу добавить XML строку как XML, а не как строку к дереву pugi xml?

Ie. выходной я хотел бы:

<?xml version="1.0"?>
<OurConfig>
    <CustomData>
    <CfgRoot>
      <SomeValue name="External setting for foo" value="Foo"/>
      <SomeValue name="External setting for bar" value="Bar"/>
    </CfgRoot>
  </CustomData>
</OurConfig>

1 Ответ

1 голос
/ 21 февраля 2020

В документах перечислены три метода. Я использовал первый, делая удобную функцию, подобную этой:

bool AppendXMLString(pugi::xml_node target, const std::string& srcString)
{
  // parse XML string as document
  pugi::xml_document doc;
  if (!doc.load_buffer(srcString.c_str(), srcString.length()))
    return false;

  for (pugi::xml_node child = doc.first_child(); child; child = child.next_sibling())
    target.append_copy(child);
  return true;
}
...