【问题标题】:Unable to parse XML using Libxml2 in C无法在 C 中使用 Libxml2 解析 XML
【发布时间】:2012-05-24 18:29:42
【问题描述】:

我是 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 标记。这个程序有什么问题,这是正确的方法吗?

【问题讨论】:

    标签: c xml libxml2


    【解决方案1】:

    首先,我不是 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...
        }
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 2014-07-15
      • 2013-03-04
      相关资源
      最近更新 更多