TinyXML Итерация по поддереву

У кого-нибудь есть код для перебора узлов поддерева в TinyXML? IE: Учитывая родителя, пройти через всех своих детей и всех своих детей детей?

2 ответа

Решение

Ответ Бегемота звучит довольно хорошо для меня.

Вот упрощенная версия метода Accept() TiXmlElement, который не использует посетителя и вместо этого принимает TiXmlNode* в качестве параметра:

void TiXmlIterator::iterate(const TiXmlNode* el)
{
  cout << "Iterating Node " << el->Value() << endl;
  // More useful code here...

  for (const TiXmlNode* node=el->FirstChild(); node; node=node->NextSibling())
  {
    iterate(node);
  }
 // And/Or here.
}

Метод Accept() принимает TiXmlVisitor в качестве параметра и выполняет все итерации за вас. И вам не нужно вызывать его для всего документа, только для корневого узла поддерева, которое вы хотите пройти. Таким образом, вы можете определить конкретное поведение для подклассов TiXmlNode, переопределив правильные методы. Посмотрите на реализацию TiXmlPrinter в исходном коде TinyXml для хорошего примера того, как это делается.

Если вы не хотите этого делать, вот еще один пример:

bool MyTiXmlVisitor::Visit(const TiXmlText& text)
{
  cout << "Visiting Text: " << text.Value() << endl;

  return true; // This will ensure it keeps iterating
}

Это будет действовать на все текстовые элементы в поддереве узла, на котором вы вызываете Accept(). Чтобы действовать на все элементы, переопределите оставшиеся виртуальные методы TiXmlVisitor. Затем в коде, в котором вы хотите перебрать поддерево, выполните следующие действия:

subtree_root_node->Accept( my_tixmlvisitor_object );

Вы можете использовать реализацию шаблона Visitor в библиотеке. Создайте класс, унаследованный от TiXmlVistor, переопределите необходимые методы, такие как VisitElement, а затем вызовите метод Accept() для определенного узла.

Другие вопросы по тегам