0

我正在尝试以一种肮脏的方式使用 rapidxml 附加一个非常大的子树,利用该value方法

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

但是当我打印文档时&lt,尖括号会扩展。&gt干净的方法是手动声明和附加子树的每个节点和属性,这很无聊。

有没有办法防止括号扩展,或者你能建议任何其他实用的方法来快速添加一个大分支?

4

3 回答 3

2

恕我直言,最简单的方法是用新文档解析它,然后克隆它,比如

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;
}

我不认为这在解析中是一个很大的开销......

于 2012-10-26T09:23:50.723 回答
1

好的,我想出了这个解决方法,自动创建结构并附加它:

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);

任何改进它的想法,也许是为了避免解析子树的额外开销?

于 2012-10-15T09:31:27.060 回答
0

编写一个辅助函数或类,例如

#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>
于 2012-10-12T14:12:25.267 回答