2010-02-08 5 views
8

मैं एक्सएमएल अभिलेखागार पर boost :: serialization का उपयोग शुरू कर रहा हूं। मैं डेटा का उत्पादन और पढ़ सकता हूं, लेकिन जब मैं एक्सएमएल को हाथ-संशोधित करता हूं और दो टैग्स का आदान-प्रदान करता हूं, तो यह "विफल होने में विफल रहता है" (यानी यह खुशी से प्राप्त होता है)।एक्सएमएल अभिलेखागार में टैग नामों के लिए :: क्रमबद्धता जांच को बढ़ावा क्यों नहीं देता है?

यहां एक छोटा, स्वयं पूर्ण उदाहरण दिखा रहा है कि मैं क्या देखें:

#include <iostream> 
#include <fstream> 
#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/serialization/nvp.hpp> 
#include <boost/serialization/split_member.hpp> 
using namespace std; 

int main (void) 
{ 
    boost::archive::xml_oarchive oa (cout); 
    static const string producer = "XXX", version = "0.0.1"; 
    oa << boost::serialization::make_nvp ("producer", producer); 
    oa << boost::serialization::make_nvp ("producer_version", version); 
} 

यह मानक उत्पादन, जिसमें करने के लिए XML लिखते हैं:

<producer>XXX</producer> 
<producer_version>0.0.1</producer_version> 

अब, मैं सभी कोड के स्थान पर एक पाठक के साथ मुख्य समारोह:

boost::archive::xml_iarchive ia (cin); 
    string producer, version; 
    ia >> boost::serialization::make_nvp ("producer", producer); 
    ia >> boost::serialization::make_nvp ("producer_version", version); 
    cout << producer << " " << version << endl; 

जो पिछले आउटपुट को खिलाते समय अपेक्षित काम करता है (आउटपुट "एक्स एक्सएक्स 0.0.1 ")। यदि, हालांकि, मैं इसे एक्सएमएल खिलाता हूं जिसमें मैंने दो लाइनों "निर्माता" और "निर्माता_वर्जन" के क्रम को बदल दिया है, यह अभी भी "0.0.1 XXX" चलाता है और आउटपुट करता है।

इस प्रकार, यह पहचानने में विफल रहता है कि टैग के अपेक्षित नाम नहीं हैं, और बस आगे बढ़ें। the doc में संकेत के अनुसार, मुझे xml_archive_parsing_error अपवाद फेंकने की उम्मीद होगी।

क्या यहां किसी के पास इसका अनुभव है? क्या मैं गलत हूं?

उत्तर

6

बस दो लाइनों के क्रम को बदलने से xml_archive_parsing_error अपवाद नहीं होगा। doc आप लिंक करने के बाद का कहना है कि खुद को:

(...) यह संभव हो तो केवल डेटा बदल गया है और XML गुण नहीं मिल पाता संरचना नहीं अनछुए छोड़ दिया है हो सकता है (...)

आपने गुणों को नहीं बदला है और ऑर्डर चेंज ने संरचना को रखा है (अभी भी आपके एक्सएमएल के पहले स्तर पर दो फ़ील्ड)। इस तरह से कोई अपवाद नहीं फेंक दिया जाएगा।

साथ ही, make_nvp function का उपयोग कर एक्सएमएल पढ़ने पर, नाम पैरामीटर जो पढ़ा जा रहा है उस पर कोई प्रतिबंध नहीं लगाएगा। यह केवल मनमाने ढंग से नाम को नए नाम-मूल्य जोड़ी के साथ उपयोग करने के लिए बताएगा।

तो, आप अपने इनपुट पर अपने एक्सएमएल टैग का नाम बदल सकते हैं, जब तक आप अपने उम्मीद आदेश को बदल नहीं है यानी आप foo और bar करने के लिए अपने एक्सएमएल पर producer और producer_version नाम बदलने सकता है और अभी भी धारावाहिक डेटा पढ़ता था सही ढंग से अर्थात्:

<foo>XXX</foo>
<bar>0.0.1</bar>

और अपने मुद्रित जवाब अभी भी "XXX होगा 0.0.1 "

चूंकि यह केवल आपके सीरियलाइज्ड डेटा को एक्सएमएल के रूप में स्वरूपित करता है, टैग नामों की जांच करने में कोई रूचि नहीं है। उनका उपयोग केवल आपके धारावाहिक आउटपुट को और अधिक पठनीय बनाने के लिए किया जाता है।

+6

उदास की तरह, लेकिन अगर ऐसा ही है। जानकारी के लिए धन्यवाद (मुझे इस दस्तावेज़ अनुच्छेद को विशेष रूप से पढ़ने के लिए मुश्किल है, क्योंकि निषेध और सशर्त के अत्यधिक उपयोग के कारण)। –

+0

...प्लस, एक्सएमएल टैग स्थिरता के लिए लाइब्रेरी की जांच की भावना में एक अस्वीकार्य प्रदर्शन जुर्माना माना जाएगा। दूसरे शब्दों में, बूस्ट क्रमबद्धता में एक्सएमएल टैग केवल मनुष्यों के लिए है, सॉफ्टवेयर के लिए नहीं। यह वास्तव में शुरुआत में अंतर्ज्ञानी और उलझन में है, मैं एक्सएमएल जांच की अनुमति देने के लिए एक विकल्प पसंद करता। – alfC

संबंधित मुद्दे