1

RapidXML と C++ を使用して解析することになっている XML ファイルがあります。ファイルは系統樹です。各ノードには、それぞれ値を持つ 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>

助けてくれてありがとう!

4

1 に答える 1

1

一部のノードがオプションの場合、ライブラリがノードのNULL1つを見つけられないときに戻る可能性があります。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内のデータの順序への依存度が低くなり、将来的に変更される可能性があります。

于 2013-03-06T21:44:04.880 に答える