RapidXML节点异常处理

时间:2014-07-11 14:00:57

标签: c++ xml exception-handling rapidxml

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

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

的.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应该工作的方式还是我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

我对RapidXML并不完全熟悉,但我在其参考页面上发现了以下关于first_node的内容。 http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1what_is_rapidxml

  

function xml_node :: first_node

     

概要

     

xml_node * first_node(const Ch * name = 0,std :: size_t name_size = 0,   bool case_sensitive = true)const;描述

     

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

     

name要查找的子项的名称,或者0表示返回第一个孩子,不管是什么   其名称;如果name_size,则此字符串不必为零终止   是非零name_size名称的大小,以字符为单位,或0表示大小   从字符串case_sensitive自动计算应该命名   比较是区分大小写的;不区分大小写的比较工作   仅适用于ASCII字符返回

     

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

所以你可以调用first_node而不必指定它的名字。(虽然这可能不是你问题的直接答案。)

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