0

私は次のようなxmlファイルを持っています:

<Config>
    <tlvid id="2">
              <type>10</type>
              <Devid>001b00100000</Devid>
    </tlvid>

    <tlvid id="3">
             <sessionid>abcd123</sessionid>
    </tlvid>

xmlファイルを解析するコードは次のとおりです。

xmlNode *cur_node = NULL,*sub_node = NULL;
xmlChar *key;

cur_node = a_node->xmlChildrenNode;
while(cur_node !=NULL) {

        if((!xmlStrcmp(cur_node->name,(const xmlChar*)"tlvid"))) {
            key = xmlGetProp(cur_node,(const xmlChar*)"id");
            printf("key: %s\n ",key);
            xmlFree(key);
            sub_node = cur_node->xmlChildrenNode;

            while(sub_node !=NULL) {

            key = xmlNodeGetContent(sub_node);
            printf("subkey: %s\n ",key);
            xmlFree(key);

            sub_node = sub_node->next;
            }
        }
     cur_node = cur_node->next;
}

次のような出力:

キー:2

サブキー:

サブキー:10

サブキー:

サブキー:001b00100000

サブキー:

キー:3

サブキー:

サブキー:abcd123

サブキー:

xmlKeepBlanksDefault(0);を試しました。空白を避けるためにwhileループを追加しましたが、役に立ちませんでした。これらの空の空白を削除するのを手伝ってくれませんか。ありがとう。

4

1 に答える 1

2

cur_node以下をチェックして、の子のテキストの処理を避けてくださいxmlNodeIsText

for(sub_node = cur_node->xmlChildrenNode;
    sub_node != NULL;
    sub_node = sub_node->next)
{
    if(xmlNodeIsText(sub_node)) continue;
    …
}

すべてのテキストノードをスキップする代わりに、次を使用して空白ノードのみをスキップするようにすることができますxmlIsBlankNode

for(sub_node = cur_node->xmlChildrenNode;
    sub_node != NULL;
    sub_node = sub_node->next)
{
    if(xmlIsBlankNode(sub_node)) continue;
    …
}

<tlvid>要素内に直接空白以外のテキストがある場合、2つの結果は異なります。

のマニュアルをxmlKeepBlanksDefault読んで、パーサーがこれらの空白ノードを無視するようにするために必要な条件を見つけてください。どうやら、これが効果を発揮するには、検証パーサーと適切なDTDが必要です。

于 2012-09-05T11:44:41.930 に答える