0

valueメソッドを悪用して、rapidxmlを汚い方法で使用して非常に大きなサブツリーを追加しようとしています

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

しかし、ドキュメントを印刷すると、山かっこが&ltandに展開されます。&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 に答える