RapidXML Анализ XML в режиме «Сначала в глубину»

Я пытаюсь разобрать большой файл XML (1,8 ГБ), используя RapidXML на С++. Хотя я могу получить дочерние элементы любого конкретного узла, используя следующий метод:

for(xml_node<> *child = node->first_node(); child; child = child->next_sibling()) {
...
}

Я не могу понять, как разобрать его в глубину. RapidXML не предоставляет для этого встроенных итераторов. Есть ли какая-либо другая библиотека с высокой производительностью для обработки больших файлов xml (в DOM, а не в SAX)?


person Koustuv Sinha    schedule 11.04.2016    source источник
comment
pugiXML — очень эффективная альтернатива и раздел 5.7 руководства предполагает, что обход в глубину возможен.   -  person acraig5075    schedule 11.04.2016
comment
может ли он обрабатывать большие объемы памяти? тогда попробую!   -  person Koustuv Sinha    schedule 11.04.2016


Ответы (1)


Вы путаете синтаксический анализ XML с обходом содержимого.

RapidXML анализирует XML за один линейный проход, создавая дерево объектов по мере его продвижения. Затем вы можете перемещаться по дереву любым удобным для вас способом.

Поиск в глубину, как правило, является рекурсивной процедурой, но в рамках вашего поиска вы будете перебирать все узлы каждого узла, используя код, который вы показали. Разница заключается в том, что вы делаете с каждым узлом, когда перебираете его.

  void processNode(xml_node<> node)
  {
    for(xml_node<> *child = node->first_node(); child; child = child->next_sibling()) 
    {
      processNode(child);
      ... and do more stuff here...
    }
  }  
person Roddy    schedule 14.04.2016