2013-03-06 63 views
1

我需要使用RapidXML和C++解析XML文件。該文件是一個系統發育樹。每個節點都有一個具有1-3個子節點的節點,每個節點都有值。節點可以是科學名稱,通用名稱或等級。我的問題是,由於每個分類節點的子節點有所不同(例如,可能有科學名稱和常用名稱,而且可能只有科學名稱),我將如何訪問子節點的每個值? 例如,我寫的代碼:使用RapidXML解析

for (xml_node<> * clade_node = root_node->first_node("clade"); clade_node; clade_node = clade_node->next_sibling()) 
    { 
     xml_node<> * taxonomy_node = clade_node->first_node("taxonomy"); 

     xml_node<> * sciName_node = taxonomy_node->first_node("scientific_name"); 
     xml_node<> * comName_node = taxonomy_node->next_sibling("common_name"); 
     xml_node<> * rank_node = taxonomy_node->next_sibling("rank"); 

     string sciName = sciName_node->value(); 
     string comName = comName_node->value(); 
     string rank = rank_node->value(); 

    } 

但我在行string comName = comName_node->value()得到EXC_BAD_ACCESS的線程錯誤和RapidXML這種方法文件

Ch *value() const 
{ 
    return m_value ? m_value : nullstr(); 
} 

這裏是一塊文件我的解析:

<phylogeny rooted="true" rerootable="false"> 
    <clade> 
    <clade> 
     <taxonomy> 
     <scientific_name>Neomura</scientific_name> 
     </taxonomy> 
    </clade> 
    <clade> 
     <taxonomy> 
     <id provider="uniprot">2</id> 
     <scientific_name>Bacteria</scientific_name> 
     <rank>superkingdom</rank> 
     </taxonomy> 
    </clade> 
    </clade> 
</phylogeny> 

感謝您的幫助!

回答

2

如果某些節點是可選的,那麼當它找不到它們中的一個時,它可能會返回NULL。你可能需要檢查返回值不NULL你之前甚至取消引用指針得到任何可能的value()

string sciName = sciName_node->value(); // crash if scientific_name not present 
string comName = comName_node->value(); 
string rank = rank_node->value(); 

我也認爲在節點/兄弟姐妹的電話您的名字的使用都有點脆。只需調用first_node/next_sibling而不用名稱,然後在實際返回節點(檢查NULL)後檢查名稱可能會更好。然後執行與名稱相關的邏輯。

這使您不太依賴XML中的數據順序,這可能會改變行的順序。

+0

非常感謝您的幫助! – 2013-03-07 16:44:35

+0

沒問題,這是一個非常明確的問題 – 2013-03-07 18:40:22