使用RapidXML进行解析

时间:2013-03-06 21:36:10

标签: c++ xml xml-parsing rapidxml

我有一个XML文件,我应该使用RapidXML和c ++解析它。该文件是系统发育树。每个节点都有一个包含1-3个子节点的节点,每个子节点都有值。节点可以是科学名称,通用名称或等级。我的问题是,由于每个分类节点的子节点各不相同(例如,一个可能同时具有科学名称和通用名称,一个可能只有科学名称),我将如何访问子节点的每个值? 例如,我写了代码:

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()和RapidXML文件的这个方法中得到了EXC_BAD_ACCESS的线程错误

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>

感谢您的帮助!

1 个答案:

答案 0 :(得分: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中的数据顺序,这可能会改变行。

相关问题