@@ -107,7 +107,7 @@ struct XMLParser::PImpl
107107 void getPortsRecursively (const XMLElement* element,
108108 std::vector<std::string>& output_ports);
109109
110- void loadDocImpl (XMLDocument* doc, bool add_includes);
110+ std::string loadDocImpl (XMLDocument* doc, bool add_includes);
111111
112112 std::list<std::unique_ptr<XMLDocument> > opened_documents;
113113 std::map<std::string, const XMLElement*> tree_roots;
@@ -156,7 +156,8 @@ XMLParser& XMLParser::operator=(XMLParser&& other) noexcept
156156XMLParser::~XMLParser ()
157157{}
158158
159- void XMLParser::loadFromFile (const std::filesystem::path& filepath, bool add_includes)
159+ std::string XMLParser::loadFromFile (const std::filesystem::path& filepath,
160+ bool add_includes)
160161{
161162 _p->opened_documents .emplace_back (new XMLDocument ());
162163
@@ -165,17 +166,17 @@ void XMLParser::loadFromFile(const std::filesystem::path& filepath, bool add_inc
165166
166167 _p->current_path = std::filesystem::absolute (filepath.parent_path ());
167168
168- _p->loadDocImpl (doc, add_includes);
169+ return _p->loadDocImpl (doc, add_includes);
169170}
170171
171- void XMLParser::loadFromText (const std::string& xml_text, bool add_includes)
172+ std::string XMLParser::loadFromText (const std::string& xml_text, bool add_includes)
172173{
173174 _p->opened_documents .emplace_back (new XMLDocument ());
174175
175176 XMLDocument* doc = _p->opened_documents .back ().get ();
176177 doc->Parse (xml_text.c_str (), xml_text.size ());
177178
178- _p->loadDocImpl (doc, add_includes);
179+ return _p->loadDocImpl (doc, add_includes);
179180}
180181
181182std::vector<std::string> XMLParser::registeredBehaviorTrees () const
@@ -232,7 +233,7 @@ void BT::XMLParser::PImpl::loadSubtreeModel(const XMLElement* xml_root)
232233 }
233234}
234235
235- void XMLParser::PImpl::loadDocImpl (XMLDocument* doc, bool add_includes)
236+ std::string XMLParser::PImpl::loadDocImpl (XMLDocument* doc, bool add_includes)
236237{
237238 if (doc->Error ())
238239 {
@@ -348,6 +349,23 @@ void XMLParser::PImpl::loadDocImpl(XMLDocument* doc, bool add_includes)
348349
349350 tree_roots[tree_name] = bt_node;
350351 }
352+
353+ // Get the name of the tree to run (either explicit or single tree).
354+ std::string main_tree_to_execute;
355+ if (const auto main_tree_attribute = xml_root->Attribute (" main_tree_to_execute" ))
356+ {
357+ main_tree_to_execute = main_tree_attribute;
358+ }
359+ else if (xml_root->FirstChild () == xml_root->LastChild ())
360+ {
361+ // special case: there is only one registered BT.
362+ const auto & e = xml_root->FirstChildElement ();
363+ if (e->FindAttribute (" ID" ))
364+ {
365+ main_tree_to_execute = e->Attribute (" ID" );
366+ }
367+ }
368+ return main_tree_to_execute;
351369}
352370
353371void VerifyXML (const std::string& xml_text,
0 commit comments