获取标签属性的 Libxml 问题
Libxml issue to get the attribute of a tag
我只想获取属性对象的值,但如果在第一个节点之后不起作用,因为它没有进入循环,为什么?
这是我的 xml 文件:
<msg><tag date="1557417027960" session="1697"><decision object="BAST04HEF" reliability="95" context="RO" x="796" y="371"
width="89" height="18"
direction="front"><jpeg></jpeg></decision></tag></msg>
这是我的代码:
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);
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"decision"))) {
object = xmlGetProp(cur, "object");
printf("object: %s\n", object);
xmlFree(object);
}
cur = cur->next;
}
xmlFreeDoc(doc);
return EXIT_SUCCESS;
}
您的代码只处理一级 children,即根元素的直接 children。
cur = xmlDocGetRootElement(doc);
获取根元素。
cur = cur->xmlChildrenNode;
获取根元素的第一个(直接)child。
在你的循环中你得到第一个 child 和 cur = cur->next;
的所有兄弟姐妹,但你不处理他们可能的 children.
您的 XML 代码段显示您至少有三层:msg
- tag
- decision
.
如果您想处理所有 decision
个元素,而不管它们的 parents 是什么,您可以使用递归函数。
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;
}
}
我只想获取属性对象的值,但如果在第一个节点之后不起作用,因为它没有进入循环,为什么?
这是我的 xml 文件:
<msg><tag date="1557417027960" session="1697"><decision object="BAST04HEF" reliability="95" context="RO" x="796" y="371"
width="89" height="18"
direction="front"><jpeg></jpeg></decision></tag></msg>
这是我的代码:
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);
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"decision"))) {
object = xmlGetProp(cur, "object");
printf("object: %s\n", object);
xmlFree(object);
}
cur = cur->next;
}
xmlFreeDoc(doc);
return EXIT_SUCCESS;
}
您的代码只处理一级 children,即根元素的直接 children。
cur = xmlDocGetRootElement(doc);
获取根元素。
cur = cur->xmlChildrenNode;
获取根元素的第一个(直接)child。
在你的循环中你得到第一个 child 和 cur = cur->next;
的所有兄弟姐妹,但你不处理他们可能的 children.
您的 XML 代码段显示您至少有三层:msg
- tag
- decision
.
如果您想处理所有 decision
个元素,而不管它们的 parents 是什么,您可以使用递归函数。
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;
}
}