gpt4 book ai didi

c++ - 使用 RapidXML 解析

转载 作者:行者123 更新时间:2023-11-30 04:20:29 27 4
gpt4 key购买 nike

我有一个 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>

感谢您的帮助!

最佳答案

如果某些节点是可选的,则库可能会在找不到其中之一时返回 NULL。在取消引用指针以获取任何可能的 value() 之前,您可能需要检查返回值不是 NULL:

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

我还认为您在调用节点/ sibling 时使用名称有点脆弱。最好只调用不带名称的 first_node/next_sibling,然后在实际返回节点后检查名称(检查 NULL)。然后执行名称相关的逻辑。

这使您减少了对 XML 中数据顺序的依赖,这些顺序可能会随着时间的推移而改变。

关于c++ - 使用 RapidXML 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15258553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com