2011-01-12 3 views
3
std::string src = "<xml><node1>aaa</node1><node2>bbb</node2><node1>ccc</node1></xml>"; 
std::string src2 = "<nodex>xxx</nodex>"; 

Ich möchte den Knoten in src2 im Inneren des Baumes in src mit RapidXML anhängen ich dies tun:Wie Einfügen eines neuen Knotens in einem XML-Dokument mithilfe von RapidXml für C++ mithilfe von Zeichenfolgen?

xml_document<> xmldoc; 
xml_document<> xmlseg; 
std::vector<char> s(src.begin(), src.end()); 
std::vector<char> x(src2.begin(), src2.end()); 
xmldoc.parse<0>(&s[0]); 
xmlseg.parse<0>(&x[0]); 
xml_node<>* a = xmlseg.first_node(); /* Node to append */ 
xmldoc.first_node("xml")->append_node(a); /* Appending node a to the tree in src */ 

Nun, toll es kompiliert, aber beim Laufen habe ich diesen schrecklichen Fehler:

void rapidxml::xml_node::append_node(rapidxml::xml_node*) [with Ch = char]: Assertion `child && !child->parent() && child->type() != node_document' failed. Aborted

Ich weiß nicht, wie es geht. Das Problem ist einfach Ich muss einen Knoten an einen Baum (xml) anhängen, aber ich habe Zeichenfolgen.

Ich denke, dies geschieht, weil ich einen Knoten eines Baumes in einen anderen Baum einzufügen bin versucht ... nur für einen bestimmten Baum zugeordnet Knoten zu dem Baum hinzugefügt ... this sucks ...

Gibt es eine Möglichkeit, auf einfache Weise zu tun, was ich brauche?

Vielen Dank.

Antwort

3
#include <iostream> 
#include <string> 
#include <vector> 

#include <rapidxml.hpp> 
#include <rapidxml_print.hpp> 

int main(){ 
std::string src = "<xml><node1>aaa</node1><node2>bbb</node2><node1>ccc</node1></xml>"; 
std::string src2 = "<nodex><nodey>xxx</nodey></nodex>"; 
//std::string src2 = "<nodex>xxx</nodex>"; 
rapidxml::xml_document<> xmldoc; 
rapidxml::xml_document<> xmlseg; 

std::vector<char> s(src.begin(), src.end()); 
s.push_back(0); // make it zero-terminated as per RapidXml's docs 

std::vector<char> x(src2.begin(), src2.end()); 
x.push_back(0); // make it zero-terminated as per RapidXml's docs 

xmldoc.parse<0>(&s[ 0 ]); 
xmlseg.parse<0>(&x[0]); 

std::cout << "Before:" << std::endl; 
rapidxml::print(std::cout, xmldoc, 0); 

rapidxml::xml_node<>* a = xmlseg.first_node(); /* Node to append */ 

rapidxml::xml_node<> *node = xmldoc.clone_node(a); 
//rapidxml::xml_node<> *node = xmldoc.allocate_node(rapidxml::node_element, a->name(), a->value()); 
xmldoc.first_node("xml")->append_node(node); /* Appending node a to the tree in src */ 

std::cout << "After :" << std::endl; 
rapidxml::print(std::cout, xmldoc, 0); 
} 

Ausgang:

<xml> 
     <node1>aaa</node1> 
     <node2>bbb</node2> 
     <node1>ccc</node1> 
</xml> 

After : 
<xml> 
     <node1>aaa</node1> 
     <node2>bbb</node2> 
     <node1>ccc</node1> 
     <nodex> 
       <nodey>xxx</nodey> 
     </nodex> 
</xml> 
+0

Vielen Dank für Ihre Antwort, aber das funktioniert sicher. Ich muss beide Zeichenfolgen analysieren, um zwei Knoten zu erhalten. Ich kann keine der beiden Anforderungen vermissen. Das Zuweisen von Knoten macht sie zu denen, die ich anhängen möchte, und das Beispiel funktioniert, aber das ist nicht meine Situation. Es tut mir Leid. Danke trotzdem für deine Hilfe :) – Andry

+0

@Adry: siehe update. Der Punkt, den ich versuchte, war, dass Knoten, die eingefügt werden sollen, aus demselben Speicherpool/xml_document zugewiesen werden müssen, dem Sie sie hinzufügen möchten. –

+0

Eugen, danke. Es ist eine gute Lösung ... Ich habe nicht darüber nachgedacht ... aber ich brauche noch mehr, weißt du, also kann ich mich nur auf einen Knoten konzentrieren, mein Realfall ist, dass der Knoten andere Knoten enthalten kann, und Ohne die interne Struktur des Knotens zu kennen, möchte ich die gesamte Hierarchie zum Baum hinzufügen können. Nun, ich denke, ich muss diese Knoten hinzufügen, die manuell den Baum navigieren, aber Sie waren wirklich hilfreich. Du verdienst die richtige Antwort. :) Danke :) – Andry

Verwandte Themen