【问题标题】:RapidXML - how can I handle missing nodes/valuesRapidXML - 我如何处理丢失的节点/值
【发布时间】:2014-05-14 14:53:29
【问题描述】:

我想使用 RapidXML 从 XML 读取到 C++。但是,如果节点不存在或缺少值,程序就会崩溃。

for (rapidxml::xml_node<> * xmlasset_node = root_node->first_node("Asset"); xmlasset_node; xmlasset_node = xmlasset_node->next_sibling())
{mystring += xmlasset_node->first_attribute("name")->value()};

但是,此“名称”属性并非在所有节点中都存在,并且如果不在 XML 中,则使用默认值填充。与此类似,我在所有节点中都有一些子节点。原因只是为了让 XML 尽可能小而清晰,以便手动调整。

如何实现检查/测试 (C++),以防止程序崩溃并在值/节点不存在时仅采用默认值?

亲切的问候, - 软木塞

【问题讨论】:

    标签: c++ rapidxml


    【解决方案1】:

    这是我所做的,您可以比较节点的值及其属性是否符合您的条件,然后您接受它: // 基本上我在寻找“设置”节点,然后是“网络”子节点,然后是“端口”属性

      if( boost::iequals(doc.first_node()->next_sibling()->name(), "settings"))
            {
                for (xml_node<> *node = doc.first_node()->next_sibling()->first_node(); node; node = node->next_sibling())
                {
    
                    // find network tag 
                    if (boost::iequals(node->name(),"network"))
                    {
    
                        for (xml_attribute<> *attr = node->first_attribute(); attr; attr = attr->next_attribute())
                        {
                            if ( boost::iequals(attr->name(), "port"))
                            {
                                strcpy(attr->value(), portname);
                            }
                        }
                    }
              }
        }
    

    【讨论】:

    • 谢谢 Samer,用你的方法我解决了这个问题!案件结案:)
    • @Corak55 you.re 欢迎...你能接受答案吗 :)
    • 你好萨默,当然。我对这里很陌生,所以请道歉:)这样正确吗(绿色标记)?亲切的问候 - Corak
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2016-12-26
    相关资源
    最近更新 更多