Самый быстрый способ разобрать файл XML с libxml2?

0

Привет, есть ли " более быстрый " способ проанализировать XML файл с помощью libxml2? Прямо сейчас я делаю это следующим образом C++ Код:

void parse_element_names(xmlNode * a_node, int *calls)
{
    xmlNode *cur_node = NULL;

    for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
      (*calls)++;
      if(xmlStrEqual(xmlCharStrdup("to"),cur_node->name)){
        //printf("node type: <%d>, name <%s>, content: <%s> \n", cur_node->children->type, cur_node->children->name, cur_node->children->content);
        //do something with the content
        parse_element_names(cur_node->children->children,calls);
        }
      else if(xmlStrEqual(xmlCharStrdup("from"),cur_node->name)) {
        //printf("node type: <%d>, name <%s>, content: <%s> \n", cur_node->children->type, cur_node->children->name, cur_node->children->content);
        //do something with the content
        parse_element_names(cur_node->children->children,calls);
        }
      else if(xmlStrEqual(xmlCharStrdup("note"),cur_node->name)) {
        //printf("node type: <%d>, name <%s>, content: <%s> \n", cur_node->children->type, cur_node->children->name, cur_node->children->content);
        //do something with the content
        parse_element_names(cur_node->children->children,calls);
        }
        .
        .
        .
        //about 100 more node names comming
      else{
        parse_element_names(cur_node->children,calls);
      }
    }

}
int main(int argc, char **argv)
{ 

    xmlDoc *doc = NULL;
    xmlNode *root_element = NULL;

    if (argc != 2)
        return(1);

    /*parse the file and get the DOM */
    doc = xmlReadFile(argv[1], NULL, XML_PARSE_NOBLANKS);

    if (doc == NULL) {
        printf("error: could not parse file %s\n", argv[1]);
    }
    int calls = 0;
    /*Get the root element node */
    root_element = xmlDocGetRootElement(doc);
    parse_element_names(root_element,&calls);

    /*free the document */
    xmlFreeDoc(doc);

    xmlCleanupParser();

    return 0;
}

Действительно ли это самый быстрый способ? Или есть лучшее/быстрое решение, которое вы можете мне посоветовать?

спасибо

  • 0
    Использование хеш-таблицы должно быть быстрее, если у вас много имен узлов. Обратите внимание, что способ использования xmlCharStrdup утечке памяти. const xmlChar * этого просто const xmlChar * строковый литерал в const xmlChar * . Разыменование children дважды также выглядит неправильно для меня.
Теги:
parsing
libxml2

1 ответ

2

xmlReadFile et al. основаны на интерфейсе parser интерфейса libxml2 SAX (на самом деле, интерфейс SAX2), поэтому, как правило, быстрее использовать собственный анализатор SAX, если вам не нужен полученный xmlDoc.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню