下面代码中将xml文档中的根节点的所有子节点倒序有什么错误? if ((config_doc = xmlReadMemory (aux, strlen(aux), NULL, NULL, XML_PARSE_NOBLANKS|XML_PARSE_NSCLEAN|XML_PARSE_NOERROR|XML_PARSE_NOWARNING|XML_PARSE_HUGE)) == NULL) { return 0; } root = xmlDocGetRootElement(config_doc); /*将XML文档中根节点的所有子节点倒序排列。*/ for (aux_node = root->children; aux_node != NULL; aux_node = root->children) { printf("aux_node %s\n",aux_node->name); xmlUnlinkNode(aux_node); xmlAddNextSibling(config_doc->last, aux_node); }
时间: 2024-03-27 09:41:11 浏览: 116
VC.XML.document.node.create.rar_VC XML CREATE_XML文档_vc xml _vc x
在上述代码中,倒序排列子节点的代码存在错误,具体如下:
```c
for (aux_node = root->children; aux_node != NULL; aux_node = root->children) {
printf("aux_node %s\n",aux_node->name);
xmlUnlinkNode(aux_node);
xmlAddNextSibling(config_doc->last, aux_node);
}
```
问题在于循环的条件 `aux_node != NULL` 永远为真,导致这个循环会一直执行下去,因为在循环体中,我们在每次迭代时都将 `aux_node` 重新赋值为 `root->children`,而 `root->children` 在每次迭代时都指向根节点的第一个子节点,因此,循环体中的内容会一直对第一个子节点进行操作,而不是对整个子节点列表进行操作。
解决这个问题的方法是,改变循环条件,让它在每次循环时都去判断当前节点是否为空,如果为空则跳出循环。下面是修改后的代码:
```c
for (aux_node = root->last; aux_node != NULL; aux_node = aux_node->prev) {
printf("aux_node %s\n", aux_node->name);
xmlUnlinkNode(aux_node);
xmlAddChild(root, aux_node);
}
```
在修改后的代码中,我们使用 `root->last` 获取到子节点列表中的最后一个节点,然后在循环体中使用 `aux_node->prev` 获取到上一个节点,这样就可以逐个地将子节点倒序排列了。同时,我们在循环条件中加入了 `aux_node != NULL` 的判断,避免了循环无限执行的问题。
阅读全文