Я использую boost ptree для чтения XML-файла, например:
ptree myTree;
... /*open xml file*/
try{
myTree.get<string>(s);
}
catch(boost::exception const& ex)
{
/*get useful info!*/
}
Я знаю, что могу использовать what()
функция, но выдает ошибку и строки, которые я только что отправил.
Есть ли способ получить более полезную информацию, такую как номера строк в XML, которые имеют отношение к вызову?
Если вы хотите обнаружить искаженный 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
В boost :: property_tree больше нет понятия номеров строк. По сути это просто итеративное дерево. Он не знает, было ли его содержимое проанализировано в файле, добавлено программно или появилось из ниоткуда. Поэтому просто невозможно получить номер строки, если дерево не содержит значений, которые вы ищете.
Вещи, которые вы могли бы рассмотреть:
get<string>
, Существует множество вариантов, позволяющих указать значения по умолчанию, получить значение NULL или сделать что-то еще, если ожидаемые данные не существуют.