如何从ptree异常中获取xml行号

时间:2013-07-22 05:55:59

标签: c++ xml exception boost ptree

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

您可能想要考虑的事情:

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