首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RapidXML节点异常处理

RapidXML节点异常处理
EN

Stack Overflow用户
提问于 2014-07-11 14:00:57
回答 1查看 914关注 0票数 1

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

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

.cpp

代码语言:javascript
复制
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

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>

<PropertyList>
    ...
</PropertyList>

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

代码语言:javascript
复制
xml_node<>* prop_node = doc.first_node("Property");

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

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-11 14:38:35

我对RapidXML并不完全熟悉,但我从它的参考页面中发现了关于first_node的以下内容。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_size为非零name_size大小的名称(以字符为单位),则此字符串不一定为零终止;如果要从字符串case_sensitive自动计算大小,则该字符串的大小应区分大小写;非区分大小写的比较只对返回的case_sensitive字符正常工作。 指向已找到子对象的指针,如果未找到则为0。

因此,您可以调用first_node,而不必指定它的名称(尽管这可能不是对您的问题的直接回答)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24699572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档