2013-07-22 9 views
8

Sto usando spinta ptree di leggere un file XML in questo modo:come posso ottenere il numero di riga XML da eccezione ptree

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

So che posso utilizzare la funzione what(), ma produce un errore e le stringhe Ho appena mandato.

C'è un modo per ottenere più informazioni utili come i numeri di riga nel xml che sono rilevanti per la chiamata?

+0

Non posso aiutarti con quel numero di riga, ma voglio lanciare, la maggior parte dei parser è libero di ordinare i tuoi elementi in un modo diverso (http://www.ibm.com/developerworks/xml/library/ x-eleord/index.html) quindi il tuo numero di linea non è davvero una buona informazione per i miei occhi – Najzero

+0

Suppongo che tu debba implementare una versione personalizzata di ptree che abbia un tipo di dati che memorizza sia il numero di riga che la stringa. Quindi dovrai specializzare il parser xml per gestire il tuo nuovo tipo speciale. Ma, anche io non ho mai usato né ptree o il suo parser xml quindi forse ho sbagliato :) – Speed8ump

risposta

2

Se si desidera rilevare XML malformati (al contrario di documenti XML che semplicemente non contengono i valori che ci si aspetta, in cui i numeri caso di linea non sono realizzabili per ottenere):

#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; 
    } 
} 

Ora date che t.xml non è un documento XML valido:

$ a.out t.xml 
error in file t.xml at line 10 
+0

grazie, ma in realtà sto cercando di rilevare se l'xml non ha i valori che mi aspetto. l'xml non è malformato perché passa attraverso la convalida dello schema. – yonigo

+0

@yonigo quindi non sono sicuro di aver capito la tua domanda, vuoi ottenere il numero di linea di cosa? – dkrikun

+0

@yonigo: Quindi è necessario aggiornare lo schema per essere più severi e utilizzarlo durante l'analisi. Boost PropertyTree non ha la possibilità di convalidare il tuo XML con uno schema personalizzato, quindi ti suggerirei di analizzarlo prima contro lo schema, quindi passarlo a PropertyTree se passa.Personalmente prenderei in considerazione l'utilizzo di RelaxNG per lo schema, ma ci sono più opzioni che probabilmente conosci. –

0

un boost :: property_tree non ha il concetto di numeri di riga più. Fondamentalmente è solo un albero iterabile. Non sa se il suo contenuto è stato analizzato da un file, aggiunto a livello di codice o uscito dal nulla. Quindi non c'è modo di ottenere un numero di linea quando l'albero non contiene i valori che stai cercando.

Cose che si potrebbe prendere in considerazione:

  • migliorare il vostro schema XML per la cattura di informazioni mancanti sulla fase di analisi. Come già sottolineato @JohnZwinck, i numeri di riga esistono ancora durante l'analisi. Dovresti essere assolutamente in grado di escludere "che la persona che crea l'xml abbia deciso di cambiare [qualcosa di strutturalmente]" in questo modo.
    Si suona come se fossero incaricati di decidere come deve essere l'XML. Anche se questo è il caso, il tuo programma si aspetta ancora che l'XML sia formato in un certo modo per fare cose significative con esso. Ed è qui che entra in gioco il tuo schema. Ora se decidono di cambiare i loro schemi noterai immediatamente dove c'è una mancata corrispondenza allo schema per cui hai progettato.
  • Utilizzare un'altra variante di get<string>. Esistono molte varianti che consentono di specificare valori predefiniti, ottenere valori null o fare qualcos'altro, se i dati che ci si aspetta non esistono.
    Il modello di codice try-instant-catch-debug-continue suggerisce che non si è completamente sicuri di quali dati aspettarsi e che non sia critico se i dati non ci sono. Le eccezioni sono per situazioni eccezionali. Mi sembra che questo non sia uno.
+0

Ok, quindi immagino di non poter fare quello che voglio! Grazie comunque – yonigo

Problemi correlati