2013-03-06 112 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