2017-04-27 4 views
1

(저는 창문 아래 있으며 Visual Studio 2015를 사용합니다.) 질문의 끝 부분에 xml을 한 줄짜리지만 꽤 예쁘게 넣습니다. 편의를 위해 notepad++으로 인쇄되었습니다 (줄 바꿈으로 XML 만 가능). msg는 "어떤 오류"어디boost :: archive :: xml_iarchive가 xml (deserizalisation context)으로 실패합니다

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

을받지

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 
} 

{m_buffer=0x00e8f504 "unrecognized XML syntax" code=other_exception }boost::archive::archive_exception 트리거합니다.

<?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을 수행합니다 :

#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은 (부스트 코드로 생성) 같은 오류를 트리거하지 않습니다 다음과 같이 interestRateCurve 클래스 정의

<?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> 

내가 뭘 잘못하고 있니? 형식이 정말로 잘못 되었습니까? 왜 그런가요? 그렇지 않다면, 무엇을해야합니까?

EDIT.

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

내 XML의

<interestRateCurve> 
... 
</interestRateCurve> 

을 둘러싸는 문제를 해결,하지만 난 하나 개의 I보다 같은 형태의 XML의 수백만을 가지고 물론, 나를 위해 실행 가능한 해결책이 아니다

답변

1

문제는 Boost에 XML 라이브러리가 없다는 것입니다.

부스트 직렬화가 XML을 읽을 수 있다고 생각하는 것 같습니다. 사실, XML 문서의 서브 세트, 즉 특정 형식 인 부스트 직렬화 아카이브 만 읽을 수 있습니다. 해당 형식이 없으면 Boost Serialization을 사용하여 읽을 수 없습니다.

대신 단순히 XML 라이브러리를 사용하십시오. 내가 PugiXML 또는 libxml2를 제안한다

What XML parser should I use in C++?

+0

오, 좋아, 실제로에만 XML 문서의 일부, 들으을 읽을 수 부스트 직렬화 몰랐어요! PugiXML 정말 괜찮 았지 만, 미리 컴파일 된 헤더를 사용하지 않습니다.이 솔루션은 제가 작업중인 큰 솔루션에서 문제가됩니다. libxml2에 대한 샷을 제공합니다 : mvs가있는 창에서 사용할 수 있습니까? http://stackoverflow.com/questions/28037909/xml-parsing-using-boost에 대해 어떻게 생각하십니까? 나도 알아, 그것은 deserialization 그 자체가 아니에요 ... –

+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 클래스의 잘못된 설계로 인해 작업을 수행 할 수 없거나 "정답이 아닌"올바른 대답 일 경우 "bad"가 표시되는 것은 아닌지 모르겠습니다. bst::archive::xml_iarchive? (bst::archive::xml_iarchive은 디버그가 정상적으로 보입니다.)