无法使用C中的Libxml2解析XML

时间:2012-05-24 18:29:42

标签: c xml libxml2

我是libxml2的新手并以一个例子开始,我不明白为什么我的示例代码没有读取某些标签。我有这样的XML文件。

<ACCOUNTS>
<ACCOUNT NO="123">
<STATE>GA</STATE>
<NAME>John</NAME>
</ACCOUNT>
<ACCOUNT NO="123">
<STATE>GA</STATE>
<NAME>Burgess</NAME>
</ACCOUNT>
</ACCOUNTS>

以下是我的示例代码:

void getReference (xmlDocPtr doc, xmlNodePtr cur) {
    xmlChar *uri;
    xmlChar *value;
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
        if ((!xmlStrcmp(cur->name, (const xmlChar *)"ACCOUNT"))) {
            uri = xmlGetProp(cur,(const xmlChar*) "NO");
            printf("uri: %s\n", uri);
            xmlFree(uri);
        }
        cur = cur->next;
    }
    return;
}

当我调试时,我注意到它第一次转到ACCOUNT标记并获取值,然后转到下一个ACCOUNT标记,忽略STATE和NAME标记。这个程序有什么问题,这是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

首先,我不是 libxml2 的专家。但是,您注意到您的代码从节点帐户转到下一个节点帐户。这是因为其他节点位于这些帐户节点下。为了获得这些忘记的子节点,您必须进入子节点层次结构。

如果你这样看,它可能更容易理解:

<ACCOUNTS>
  <ACCOUNT NO="123">
    <STATE>GA</STATE>
    <NAME>John</NAME>
  </ACCOUNT>
  <ACCOUNT NO="123">
    <STATE>GA</STATE>
    <NAME>Burgess</NAME>
  </ACCOUNT>
</ACCOUNTS>

如您所见,节点statename位于节点account下。因此,不必转到下一个,而是必须在每个子节点下运行。

基本上(作为一个简单的补丁或快速解决方案),在if语句中,你必须创建一个嵌套的while:

subnode = cur->xmlChildrenNode;
while (subnode != NULL) {
    if ((!xmlStrcmp(subnode->name, (const xmlChar *)"STATE"))) {
        // more things...
    }
}

希望这有帮助。