2012-09-05 43 views
0

我在XML文件爲:空白去除在XML使用的libxml2

<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; 
} 

輸出爲:

key:2

子項:

子項:10

子項:

子項:001b00100000

子項:

鍵:3

子項:

子項:abcd123

子鍵:

我試過xmlKeepBlanksDefault(0);在while循環下添加以避免空白,但沒有幫助。你能幫我解決這些空白的問題嗎?謝謝。的cur_node文本孩子的

+0

難道你不能在打印之前檢查'key'是否爲空? –

+0

感謝您的回覆。是的,我已經檢查,但仍然打印相同。打印前給予(鍵)。 –

+0

你應該像'if(strlen(key)!= 0)'或類似的東西來檢查,因爲'key'仍然是一個有效的指針。 –

回答

1

避免處理通過檢查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>元素中直接存在非空白文本,則兩個結果將有所不同。

閱讀the manual for xmlKeepBlanksDefault找出使解析器忽略這些空白節點所需的條件。顯然你需要一個驗證解析器和一個合適的DTD才能產生任何效果。

+0

continue將需要一個for(;;)而不是while(),否則該循環變量不會被碰撞。 – wildplasser

+0

@wildplasser,你是對的,相應地編輯回答。 – MvG

+0

好吧,我正要評論OP的BadStyle(恕我直言)。 'for(;;){}'循環要方便得多,'if(...)繼續;'跳過不需要的東西可以避免額外的{}塊+相關的縮進。 – wildplasser