8

我正在使用 boost ptree 来读取这样的 xml 文件:

ptree myTree;
... /*open xml file*/
try{
    myTree.get<string>(s);
}
catch(boost::exception const&  ex)
{
/*get useful info!*/
}

我知道我可以使用该what()函数,但它会产生错误和我刚刚发送的字符串。

有没有办法获得更多有用的信息,比如 xml 中与调用相关的行号?

4

2 回答 2

2

如果您想检测格式错误的 XML(与 XML 文档相反,它根本不包含您期望的值,在这种情况下无法获得行号):

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

int main(int argc, char* argv[])
{
  boost::property_tree::ptree pt;
  try {
    read_xml(argv[1], pt);
  } catch (const boost::property_tree::xml_parser::xml_parser_error& ex) {
    std::cerr << "error in file " << ex.filename() << " line " << ex.line() << std::endl;
  }
}

现在假设这t.xml不是一个有效的 XML 文档:

$ a.out t.xml
error in file t.xml at line 10
于 2013-07-22T06:39:36.057 回答
1

boost::property_tree 不再有行号的概念。基本上它只是一个可迭代的树。它不知道它的内容是从文件中解析出来的、以编程方式添加的还是突然出现的。因此,当树不包含您要查找的值时,就无法获得行号。

您可能需要考虑的事项:

  • 改进您的 XML 模式以捕获有关解析时间的缺失信息。正如@JohnZwinck 已经指出的那样,行号在解析时仍然存在。您绝对应该能够像这样排除“创建 xml 的人决定改变 [任何结构上的]”。
    您听起来好像他们负责决定 XML 的外观。即使是这种情况,您的程序仍然希望 XML 以某种方式形成,以便用它做有意义的事情。这就是您的架构发挥作用的地方。现在,如果他们决定更改他们的架构,您会立即注意到与您设计的架构不匹配的地方。
  • 使用get<string>. 如果您期望的数据不存在,有许多变体允许您指定默认值、获取 null 或执行其他操作。
    您的 try-instant-catch-debug-continue 代码模式表明您并不完全确定预期的数据,并且如果数据不存在,则它是非关键的。例外是针对特殊情况。在我看来,这不是一个。
于 2013-12-22T19:38:36.730 回答