【问题标题】:RapidXML node exception handlingRapidXML 节点异常处理
【发布时间】:2014-07-11 14:00:57
【问题描述】:

我正在使用 RapidXML 解析一个 xml 文件,其中包含一些我想在我的 C++ 程序中使用的变量。我能够读取有效节点,但如果节点名称拼写错误,我想添加一些错误处理。

这是我的文件的一个工作示例。

.cpp

try
{
    rapidxml::file<> xmlFile("file.xml");
    rapidxml::xml_document<> doc;
    doc.parse<parse_declaration_node | parse_no_data_nodes>(xmlFile.data());

    xml_node<>* prop_node = doc.first_node("PropertyList");
}
catch (const runtime_error& e)
{
    // Do something
}
catch (const rapidxml::parse_error& e)
{
    // Do something
}
catch (const exception& e)
{
    // Do something
}
catch(...)
{
    // Do something
}

.xml

<?xml version="1.0" encoding="utf-8"?>

<PropertyList>
    ...
</PropertyList>

如果我将 .cpp 文件中的 first_node() 调用更改为不存在的节点,如下所示:

xml_node<>* prop_node = doc.first_node("Property");

程序在运行时崩溃,抱怨内存访问不正确,而不是抛出异常。

这是 RapidXML 应该工作的方式还是我做错了什么?

谢谢!

【问题讨论】:

    标签: c++ xml exception-handling rapidxml


    【解决方案1】:

    我对 RapidXML 并不完全熟悉,但我从它的参考页面中找到了关于 first_node 的以下内容。 http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1what_is_rapidxml

    函数 xml_node::first_node

    概要

    xml_node* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) 常量;说明

    获取第一个子节点,可选择匹配节点名称。参数

    name 要查找的孩子的名称,或 0 以返回第一个孩子,无论 其名称;如果 name_size 此字符串不必以零结尾 是非零 name_size 名称的大小,以字符为单位,或 0 具有大小 从字符串 case_sensitive 自动计算应该名称 比较区分大小写;不区分大小写的比较工作 仅适用于 ASCII 字符返回

    指向找到的孩子的指针,如果没有找到,则为 0。

    因此,您可以调用 first_node 而无需指定其名称。(尽管这可能不是您问题的直接答案。)

    或者检查doc.first_node("Property")的返回值是否为0。如果返回值不为0,则只赋值给prop_node。

    【讨论】:

    • 感谢您的回复。我设法通过首先检查 first_node() 的响应是否为 0 来使其工作,然后再按照您所说的进行分配。似乎工作正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多