2017-04-27 36 views
1

(我在windows下並使用visual studio 2015.)我收到xml放在問題的末尾,以單行格式,但我漂亮印刷(XML只有換行符)與notepad++爲便利。boost :: archive :: xml_iarchive失敗,帶有一個xml(deserizalisation上下文)

std::ifstream file("D:\\FILES\\anxmlfile.xml"); 
char msg[500]; 
strerror_s(msg,errno); 
try 
{ 
    boost::archive::xml_iarchive ia(file); 
    interestRateCurve IRCurve; 
    ia >> BOOST_SERIALIZATION_NVP(IRCurve); 
} 
catch (boost::archive::archive_exception ex) 
{ 
    // blah 
} 

其中msg收到 「沒有錯誤」,並在那裏

boost::archive::xml_iarchive ia(file); 

觸發boost::archive::archive_exception{m_buffer=0x00e8f504 "unrecognized XML syntax" code=other_exception }。該interestRateCurve類被定義爲如下:

#pragma once 

#include <string> 

#include "boost/archive/text_oarchive.hpp" 
#include "boost/archive/text_iarchive.hpp" 

#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 

class calendars 
{ 
public: 
    std::string calendar; 
    template<class Archive> void serialize(Archive& archive, const unsigned int version) 
    { 
     archive & BOOST_SERIALIZATION_NVP(calendar); 
    } 
}; 

class curvepoint 
{ 
public: 
    std::string tenor; 
    std::string maturitydate; 
    double parrate; 
    template<class Archive> void serialize(Archive& archive, const unsigned int version) 
    { 
     archive & BOOST_SERIALIZATION_NVP(tenor); 
     archive & BOOST_SERIALIZATION_NVP(maturitydate); 
     archive & BOOST_SERIALIZATION_NVP(parrate); 
    } 
}; 

class interestRateCurveDeposits 
{ 
public: 
    std::string daycountconvention; 
    std::string snaptime; 
    std::string spotdate; 
    calendars m_calendars; 
    curvepoint curvepoint; 
    template<class Archive> void serialize(Archive& archive, const unsigned int version) 
    { 
     archive & BOOST_SERIALIZATION_NVP(daycountconvention); 
     archive & BOOST_SERIALIZATION_NVP(snaptime); 
     archive & BOOST_SERIALIZATION_NVP(spotdate); 
     archive & BOOST_SERIALIZATION_NVP(m_calendars); 
     archive & BOOST_SERIALIZATION_NVP(curvepoint); 
    } 
}; 

class interestRateCurveSwaps 
{ 
public: 
    std::string fixeddaycountconvention; 
    std::string floatingdaycountconvention; 
    std::string fixedpaymentfrequency; 
    std::string floatingpaymentfrequency; 
    std::string snaptime; 
    std::string spotdate; 
    calendars calendars[1]; 
    curvepoint curvepoint[1]; 
    template<class Archive> void serialize(Archive& archive, const unsigned int version) 
    { 
     archive & BOOST_SERIALIZATION_NVP(fixeddaycountconvention); 
     archive & BOOST_SERIALIZATION_NVP(floatingdaycountconvention); 
     archive & BOOST_SERIALIZATION_NVP(fixedpaymentfrequency); 
     archive & BOOST_SERIALIZATION_NVP(floatingpaymentfrequency); 
     archive & BOOST_SERIALIZATION_NVP(snaptime); 
     archive & BOOST_SERIALIZATION_NVP(spotdate); 
     archive & BOOST_SERIALIZATION_NVP(calendars); 
     archive & BOOST_SERIALIZATION_NVP(curvepoint); 
    } 
}; 

class interestRateCurve 
{ 
public: 
    std::string effectiveasof; 
    std::string currency; 
    std::string baddayconvention; 
    interestRateCurveDeposits deposits[1]; 
    interestRateCurveSwaps swaps[1]; 
    template<class Archive> void serialize(Archive& archive, const unsigned int version) 
    { 
     archive & BOOST_SERIALIZATION_NVP(effectiveasof); 
     archive & BOOST_SERIALIZATION_NVP(currency); 
     archive & BOOST_SERIALIZATION_NVP(baddayconvention); 
     archive & BOOST_SERIALIZATION_NVP(deposits); 
     archive & BOOST_SERIALIZATION_NVP(swaps); 
    } 
}; 

以下簡短的XML(具有升壓代碼段產生)不會觸發相同的錯誤:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<!DOCTYPE boost_serialization> 
<boost_serialization signature="serialization::archive" version="15"> 
<d class_id="0" tracking_level="0" version="0"> 
    <m_day>15</m_day> 
    <m_month>8</m_month> 
    <m_year>1947</m_year> 
</d> 
</boost_serialization> 

我的問題XML並:

<?xml version="1.0" standalone="yes" ?> 
<interestRateCurve> 
    <effectiveasof>2009-01-05</effectiveasof> 
    <currency>USD</currency> 
    <baddayconvention>M</baddayconvention> 
    <deposits> 
     <daycountconvention>ACT/360</daycountconvention> 
     <snaptime>2009-01-02T21:00:00.000Z</snaptime> 
     <spotdate>2009-01-07</spotdate> 
     <calendars> 
      <calendar>none</calendar> 
     </calendars> 
     <curvepoint> 
      <tenor>1M</tenor> 
      <maturitydate>2009-02-09</maturitydate> 
      <parrate>0.0043</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>2M</tenor> 
      <maturitydate>2009-03-09</maturitydate> 
      <parrate>0.010988</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>3M</tenor> 
      <maturitydate>2009-04-07</maturitydate> 
      <parrate>0.014125</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>6M</tenor> 
      <maturitydate>2009-07-07</maturitydate> 
      <parrate>0.017525</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>9M</tenor> 
      <maturitydate>2009-10-07</maturitydate> 
      <parrate>0.019063</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>1Y</tenor> 
      <maturitydate>2010-01-07</maturitydate> 
      <parrate>0.020238</parrate> 
     </curvepoint> 
    </deposits> 
    <swaps> 
     <fixeddaycountconvention>30/360</fixeddaycountconvention> 
     <floatingdaycountconvention>ACT/360</floatingdaycountconvention> 
     <fixedpaymentfrequency>6M</fixedpaymentfrequency> 
     <floatingpaymentfrequency>3M</floatingpaymentfrequency> 
     <snaptime>2009-01-02T21:00:00.000Z</snaptime> 
     <spotdate>2009-01-07</spotdate> 
     <calendars> 
      <calendar>none</calendar> 
     </calendars> 
     <curvepoint> 
      <tenor>2Y</tenor> 
      <maturitydate>2011-01-07</maturitydate> 
      <parrate>0.016509</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>3Y</tenor> 
      <maturitydate>2012-01-07</maturitydate> 
      <parrate>0.019413</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>4Y</tenor> 
      <maturitydate>2013-01-07</maturitydate> 
      <parrate>0.021521</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>5Y</tenor> 
      <maturitydate>2014-01-07</maturitydate> 
      <parrate>0.023315</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>6Y</tenor> 
      <maturitydate>2015-01-07</maturitydate> 
      <parrate>0.024588</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>7Y</tenor> 
      <maturitydate>2016-01-07</maturitydate> 
      <parrate>0.025719</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>8Y</tenor> 
      <maturitydate>2017-01-07</maturitydate> 
      <parrate>0.02656</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>9Y</tenor> 
      <maturitydate>2018-01-07</maturitydate> 
      <parrate>0.02726</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>10Y</tenor> 
      <maturitydate>2019-01-07</maturitydate> 
      <parrate>0.028</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>12Y</tenor> 
      <maturitydate>2021-01-07</maturitydate> 
      <parrate>0.02893</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>15Y</tenor> 
      <maturitydate>2024-01-07</maturitydate> 
      <parrate>0.029989</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>20Y</tenor> 
      <maturitydate>2029-01-07</maturitydate> 
      <parrate>0.030029</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>25Y</tenor> 
      <maturitydate>2034-01-07</maturitydate> 
      <parrate>0.029639</parrate> 
     </curvepoint> 
     <curvepoint> 
      <tenor>30Y</tenor> 
      <maturitydate>2039-01-07</maturitydate> 
      <parrate>0.029505</parrate> 
     </curvepoint> 
    </swaps> 
</interestRateCurve> 

我在做什麼錯?格式真的是錯誤的,爲什麼?如果不是,該怎麼辦?

編輯。內附

<interestRateCurve> 
... 
</interestRateCurve> 
我的XML的

<!DOCTYPE boost_serialization> 
<boost_serialization signature="serialization::archive" version="15"> 
... 
</boost_serialization> 

解決了這個問題,但當然不是我一個可行的解決方案,因爲我有幾百萬相同形式的XML的比我「M與戰鬥...

回答

1

問題是Boost沒有XML庫。

您似乎認爲Boost Serialization可以讀取XML。實際上,它只能讀取XML文檔的一個子集,即Boost Serialization Archives,它是一種特定的格式。如果您沒有這種格式,則無法使用Boost Serialization來讀取它。

相反,只需使用XML庫。我建議PugiXML或libxml2的:

What XML parser should I use in C++?

+0

哦,好吧,的確沒有知道升壓序列化只能讀取XML文檔的子集,THX! PugiXML我試過了,確實沒問題,但是沒有使用預編譯頭文件,這是我運行的大解決方案中的一個問題。我將給libxml2一個鏡頭:我可以在windows下使用mvs?你怎麼看待http://stackoverflow.com/questions/28037909/xml-parsing-using-boost?我知道,它本身並不是反序列化...... –

+0

呵呵。如果您使用預編譯頭文件,PugiXML可以正常工作。另外,除非你不知道如何避免緊密耦合,否則永遠不會出現「大型解決方案」中的問題。基本上,確保您永遠不要將XML庫標頭包含在「公共」或共享標頭文件中。只將它包含在使用它的(一)cpp中。 – sehe

+0

我喜歡你鏈接的答案:)它說完全一樣。如果您需要PugiXML的幫助,請查看[使用它的一些示例](https://stackoverflow.com/search?tab=votes&q=user%3a85371%20pugixml)。 Libxml2將會更難以在MSVC下設置 – sehe

0
std::ifstream file("D:\\FILES\\anxmlfile.xml"); 
char msg[500]; 
strerror_s(msg,errno); 
try 
{ 
    unsigned int flags = boost::archive::no_header; 
    boost::archive::xml_iarchive ia(file, flags); 
    interestRateCurve IRCurve; 
    ia >> BOOST_SERIALIZATION_NVP(IRCurve); 
} 
catch (boost::archive::archive_exception ex) 
{ 
    // blah 
} 

的伎倆,但隨後

ia >> BOOST_SERIALIZATION_NVP(IRCurve); 

觸發「」輸入流錯誤「code = input_stream_error」。我不知道是否這是因爲interestRateCurve類的設計不好,因此無法完成這項工作,或者如果我的答案根本不是正確的答案,導致「壞」bst::archive::xml_iarchive? (bst::archive::xml_iarchive在調試時看起來很正常。)

相關問題