1

私は 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 タグに移動して値を取得し、STATE タグと NAME タグを無視して次の ACCOUNT タグに移動することに気付きました。このプログラムの何が問題で、これは正しいアプローチですか?

4

1 に答える 1

3

まず第一に、私はlibxml2の専門家ではありません。ただし、コードがノード アカウントから次のノード アカウントに移動することに気付きました。これは、他のノードがこれらのアカウント ノードの下にあるためです。これらの忘れられたサブノードに到達するには、サブノード階層に降りる必要があります。

次のように見ると、おそらくより理解しやすいでしょう。

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

ご覧のとおり、ノードstateとノードnameはノードの下にありaccountます。そのため、次のノードに移動する代わりに、各ノードの下にあるすべての子ノードを前に実行する必要があります。

基本的に (単純なパッチまたは迅速な解決策として)、if ステートメント内で、ネストされた while を作成する必要があります。

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

お役に立てれば。

于 2012-05-24T19:14:43.680 に答える