2013-07-22 3 views
8

Я использую повысить Ptree для чтения файла XML, как это:Как я могу получить XML-номер строки из Ptree исключения

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

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

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

+0

Я не могу помочь вам с номером этой строки, но вы хотите, чтобы вставлять, что большинство парсеров могут свободно заказывать ваши элементы по-другому (http://www.ibm.com/developerworks/xml/library/ x-eleord/index.html), поэтому ваш номер строки не является действительно хорошей информацией в моих глазах. – Najzero

+0

Я бы предположил, что вам нужно реализовать пользовательскую версию ptree, которая имеет тип данных, который хранит номер строки, а также строку. Тогда вам придется специализировать синтаксический анализатор xml, чтобы иметь дело с вашим новым специальным типом. Но я также никогда не использовал ни ptree, ни его XML-парсер, поэтому, возможно, я ошибаюсь :) – Speed8ump

ответ

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 
+0

спасибо, , но на самом деле я пытаюсь определить, не имеет ли xml ожидаемых значений. xml не искажен, потому что он проходит проверку схемы. – yonigo

+0

@yonigo, тогда я не уверен, что я понимаю ваш вопрос, вы хотите получить номер строки чего? – dkrikun

+0

@yonigo: Затем вам нужно обновить свою схему, чтобы быть более строгим и использовать ее при разборе. Boost PropertyTree не имеет возможности проверять ваш XML на пользовательской схеме, поэтому я бы предложил сначала разобрать его по схеме, а затем передать его PropertyTree, если он пройдет.Лично я бы подумал об использовании RelaxNG для схемы, но есть несколько вариантов, которые вы, вероятно, знаете. –

0

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

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

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

Хорошо, я думаю, я не могу делать то, что хочу! Спасибо в любом случае – yonigo

Смежные вопросы