c - 无法在 C 中使用 Libxml2 解析 XML

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

最佳答案

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

希望这对您有所帮助。

关于c - 无法在 C 中使用 Libxml2 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10743248/

相关文章:

c - 如何在 scanf() 即 c 中将空格作为输入?

ruby - 使用 Nokogiri 验证 DTD 字符串

c - Swift2 @convention(c) 与 char* 和 type**

c - 使用 Xor 交换产生错误结果

c - 目标文件缺少函数符号

ruby-on-rails - 如何使用在 url 中也有数据的 net/http 发布 xml 数据

Python xml.etree.ElementTree - 如何引用我正在解析的当前节点

ios - 使用 Libxml2 解析 XML 时占用大量 RAM

c - 罗马数字转字母

java - 自定义 JAXB 验证错误消息