TinyXML Итерация по поддереву - PullRequest
4 голосов
/ 06 апреля 2010

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

Ответы [ 2 ]

4 голосов
/ 07 декабря 2010

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

Вот упрощенная версия метода 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 );
2 голосов
/ 11 октября 2010

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

...