Rapidxml: добавление поддерева непосредственно в качестве значения

Я пытаюсь добавить очень большое поддерево, используя quickxml, используя value метод

rapidxml::xml_node<>* node = allocate_node(rapidxml::node_element, "tree");
node->value("<very><long><subtree></subtree></long></very>");

но это, но угловые скобки расширены в &lt а также &gt когда я печатаю документ. Чистым способом было бы вручную объявить и добавить каждый отдельный узел и атрибут поддерева, что довольно скучно.

Есть ли способ предотвратить расширение скобок, или вы можете предложить какой-либо другой практичный способ быстро добавить большую ветку?

0

Решение

Хорошо, я вышел с этим обходным путем, автоматически создавая структуру и добавляя ее:

char txt[] = "<very><long><xml with="attributes"></xml></long></very>";   // or extract from file
rapidxml::xml_document<char> tmp;
tmp.parse<0>(txt);

rapidxml::xml_node<char> *subt = tmp.first_node();
tmp.remove_all_nodes(); // detach, since you can't have more than one parent

appendHere.append_node(subt);

Любая идея, чтобы улучшить его, может быть, чтобы избежать лишних затрат на анализ поддерева?

1

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

Imho самый простой способ будет проанализировать его с новым документом, а затем просто клонировать его, что-то вроде

void appendLongTree(rapidxml::xml_document<>* document,
rapidxml::xml_node<>* parent,
char* value) {
rapidxml::xml_document<>* new_document = new rapidxml::xml_document<>();
// if we don't wanna bother about lifetime of the string,
// save a string in target's document
new_document.parse<0>(document->allocate_string(value));
parent->append_node(document->clone_node(new_document->first_node()));
delete new_document;
}

Я не думаю, что это большие затраты при разборе …

1

Напишите вспомогательную функцию или класс, например,

#include <iostream>

#include "rapidxml.hpp"#include "rapidxml_print.hpp"
class Node_Adder
{
public:
Node_Adder(rapidxml::xml_document<> & doc) : m_doc(doc) { }

rapidxml::xml_node<> * operator()(rapidxml::xml_node<> * parent,
char const * node_name)
{
char * name = m_doc.allocate_string(node_name);
rapidxml::xml_node<> * child = m_doc.allocate_node(rapidxml::node_element, name);
parent->append_node(child);
return child;
}
protected:
private:
rapidxml::xml_document<> & m_doc;
};void stackoverflow()
{
rapidxml::xml_document<> doc;
rapidxml::xml_node<char> * decl = doc.allocate_node(rapidxml::node_declaration);
decl->append_attribute(doc.allocate_attribute("version", "1.0"));
decl->append_attribute(doc.allocate_attribute("encoding", "UTF-8"));
doc.append_node(decl);
rapidxml::xml_node<> * root = doc.allocate_node(rapidxml::node_element, "root");
doc.append_node(root);

Node_Adder add(doc);
add(add(add(root, "very"), "long"), "subtree");

rapidxml::print(std::ostreambuf_iterator<char>(std::cout), doc);
}

который печатает

<?xml version="1.0" encoding="UTF-8"?>
<root>
<very>
<long>
<subtree/>
</long>
</very>
</root>
0
По вопросам рекламы [email protected]