2013-07-22 9 views
8

gelen xml satır numarasını alabilirsiniz:Nasıl böyle bir xml dosyasını okumak için boost ptree kullanıyorum ptree istisna

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

ben what() işlevini kullanabilirsiniz biliyorum, ama bu bir hata ve dizeleri üretir Sadece gönderdim.

Aramayla ilgili olan xml'deki satır numaraları gibi daha yararlı bilgiler almanın bir yolu var mı?

+0

Bu satır numarasında size yardımcı olamıyorum, ancak çoğu ayrıştırıcının öğelerinizi farklı bir şekilde sipariş etme özgürlüğüne sahip olmasını sağlamak istiyorum (http://www.ibm.com/developerworks/xml/library/ x-eleord/index.html) böylece satır numaranız benim gözlerimde gerçekten iyi bir bilgi değil – Najzero

+0

Bir ptree özel versiyonunu uygulamanız gerektiğini varsayalım. Sonra yeni özel türünüzle başa çıkmak için xml ayrıştırıcısını uzmanlaştırmanız gerekir. Ama ben de ptree ya da xml ayrıştırıcısını hiç kullanmadım bu yüzden belki de yanılıyor olabilirim :) – Speed8ump

cevap

2

sen (vaka hat numaralarını elde etmek mümkün değildir olduğu basitçe beklediğiniz değer içermeyen XML belgeleri, aksine) bozuk biçimli XML algılamak isterseniz:

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

Şimdi verilen

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

teşekkürler, ama aslında xml beklediğim değerlere sahip olmadığını algılamaya çalışıyorum. xml, şema doğrulamasından geçtiği için hatalı biçimlendirilmemiş. – yonigo

+0

@yonigo o zaman sorunuzu anladığımdan emin değilim, neyin satır numarasını almak istersiniz? – dkrikun

+0

@yonigo: Ardından, şemanınızı daha sıkı olacak şekilde güncellemeniz ve ayrıştırırken kullanmanız gerekir. Boost PropertyTree, XML'inizi özel bir şemaya göre doğrulayacak hiçbir özelliğe sahip değildir. Bu nedenle, önce şemaya karşı bir kez ayrıştırmayı ve ardından geçerliliğini geçerse PropertyTree'ye aktarmanızı öneririm.Şahsen RelaxNG'yi şema için kullanmayı düşünürdüm, ama muhtemelen bildiğiniz gibi birçok seçenek var. –

0

artış kaydedildi :: property_tree hat numaralarının kavramı yok artık: o t.xml geçerli bir XML dokümanı değil. Temelde sadece yinelenebilir bir ağaçtır. İçeriğinin bir dosyadan ayrıştırıldığı, programlı olarak eklendiği veya hiçbir yerden çıkmadığı bilinmemektedir. Bu nedenle, ağaç aradığınız değerleri içermediğinde satır numarası almanın hiçbir yolu yoktur. Eğer düşünebilirsiniz

şeyler:

  • ayrıştırma zamanında eksik bilgileri yakalamak için XML şemasını geliştirin. @JohnZwinck'in zaten işaret ettiği gibi, ayrıştırma sırasında satır numaraları hala var. Kesinlikle "xml'yi yaratan kişinin [yapısal olarak] herhangi bir şeyi değiştirmeye karar verdiğini" bu şekilde dışlayabilmelisiniz.
    XML'in nasıl görünmesi gerektiğine karar vermekten sorumlu oldukları gibi geliyor. Bu durumda bile, programınız XML'in onunla anlamlı şeyler yapması için belirli bir şekilde oluşturulmasını bekler. Ve şemanın burada devreye giriyor. Şimdi şemalarını değiştirmeye karar verirlerse, tasarladığınız şemaya uymamanın nerede olduğunu anında fark edeceksiniz.
  • get<string>'un başka bir çeşidini kullanın. Beklediğiniz veriler mevcut değilse, varsayılan değerleri belirlemenize, null yapmanıza veya başka bir şey yapmanıza izin veren birçok varyant vardır.
    Try-anında-yakalamak-hata ayıklama-devam etme kod deseniniz, hangi verilerin beklendiğinden ve verilerin bulunmadığı durumlarda kritik olmadığından tamamen emin olmadığınızı gösterir. İstisnalar istisnai durumlar içindir. Bana öyle görünüyor ki, bu bir değil.
+0

Tamam, sanırım istediğimi yapamıyorum! Yine de teşekkürler – yonigo