RapidXML节点异常处理

RapidXML node exception handling

本文关键字:异常处理 节点 RapidXML      更新时间:2023-10-16

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

谢谢!

我并不完全熟悉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) const;描述

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

name要查找的子节点的名称,或者返回0,不管是否返回第一个子节点它的名字;如果name_size,这个字符串不必以零结尾是非零name_size名称的大小,以字符为单位,或0有大小从字符串自动计算,区分大小写比较区分大小写;不区分大小写的比较工作

返回

指向找到的子节点,如果没有找到则为0。

因此,您可以调用first_node而不必指定其名称。(虽然这可能不是你问题的直接答案。)

或者检查doc.first_node("Property")的返回值是否为0。并且只有当返回值不为0时才将值赋给prop_node。