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