Ваш код обрабатывает только один дочерний уровень, то есть прямые дочерние элементы корневого элемента.
cur = xmlDocGetRootElement(doc);
получает корневой элемент.
cur = cur->xmlChildrenNode;
получает первый (прямой) дочерний элементкорневого элемента.
В цикле вы получаете всех братьев и сестер этого первого потомка с cur = cur->next;
, но вы не обрабатываете их возможных потомков.
Ваш фрагмент XML показывает, что у вас естьпо крайней мере, три слоя: msg
- tag
- decision
.
Если вы хотите обработать все элементы decision
независимо от их родителей, вы можете использовать рекурсивную функцию.
static void processChildren(xmlNodePtr cur)
int main(int argc, char **argv) {
char *docname;
xmlDocPtr doc;
xmlNodePtr cur;
xmlChar *object;
if (argc < 2) {
printf("Commande: %s nom_du_fichier\n", argv[0]);
return EXIT_FAILURE;
}
docname = argv[1];
doc = xmlParseFile(docname);
cur = xmlDocGetRootElement(doc);
processChildren(cur->xmlChildrenNode);
xmlFreeDoc(doc);
return EXIT_SUCCESS;
}
static void processChildren(xmlNodePtr cur)
{
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"decision"))) {
object = xmlGetProp(cur, "object");
printf("object: %s\n", object);
xmlFree(object);
}
else
{
processChildren(cur->children);
}
cur = cur->next;
}
}