Как я могу получить номер строки XML из исключения Ptree

Я использую boost ptree для чтения XML-файла, например:

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

Я знаю, что могу использовать what() функция, но выдает ошибку и строки, которые я только что отправил.

Есть ли способ получить более полезную информацию, такую ​​как номера строк в XML, которые имеют отношение к вызову?

8

Решение

Если вы хотите обнаружить искаженный 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
2

Другие решения

В boost :: property_tree больше нет понятия номеров строк. По сути это просто итеративное дерево. Он не знает, было ли его содержимое проанализировано в файле, добавлено программно или появилось из ниоткуда. Поэтому просто невозможно получить номер строки, если дерево не содержит значений, которые вы ищете.

Вещи, которые вы могли бы рассмотреть:

  • Усовершенствуйте свою XML-схему, чтобы отлавливать недостающую информацию во время разбора. Как уже указывал @JohnZwinck, при синтаксическом анализе номера строк все еще существуют. Вы определенно должны быть в состоянии исключить, «что человек, создавший XML, решил изменить [что-нибудь структурно]», как это.
    Вы говорите так, будто они отвечают за то, как должен выглядеть XML. Даже если это так, ваша программа все еще ожидает, что XML будет сформирован определенным образом, чтобы делать с ним значимые вещи. И здесь ваша схема вступает в игру. Теперь, если они решат изменить свою схему, вы сразу заметите, где есть несоответствие схеме, для которой вы разработали.
  • Используйте другой вариант get<string>, Существует множество вариантов, позволяющих указать значения по умолчанию, получить значение NULL или сделать что-то еще, если ожидаемые данные не существуют.
    Ваш шаблон кода try-instant-catch-debug-continue предполагает, что вы не совсем уверены, какие данные ожидать, и что это не критично, если данных там нет. Исключения для исключительных ситуаций. Мне кажется, что это не один.
1

По вопросам рекламы [email protected]