Привет, есть ли " более быстрый " способ проанализировать 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;
}
Действительно ли это самый быстрый способ? Или есть лучшее/быстрое решение, которое вы можете мне посоветовать?
спасибо
xmlReadFile
et al. основаны на интерфейсе parser интерфейса libxml2 SAX (на самом деле, интерфейс SAX2), поэтому, как правило, быстрее использовать собственный анализатор SAX, если вам не нужен полученный xmlDoc
.
Если вам нужно различать много разных имен элементов, как в вашем примере, самый быстрый подход обычно заключается в создании отдельных функций для каждого типа узлов и использовании хэш-таблицы для поиска этих функций.
xmlCharStrdup
утечке памяти.const xmlChar *
этого простоconst xmlChar *
строковый литерал вconst xmlChar *
. Разыменованиеchildren
дважды также выглядит неправильно для меня.