2008-11-19 15 views
14

मैंने बूस्ट सीरियलाइजेशन का उपयोग किया है, लेकिन ऐसा लगता है कि यह मुझे एक विशेष स्कीमा के अनुरूप xml उत्पन्न करने की अनुमति नहीं देता है - ऐसा लगता है कि इसका उद्देश्य केवल कक्षा के राज्य को बनाए रखना था।सी ++ में एक्सएमएल उत्पन्न करने का सबसे आसान तरीका क्या है?

मंच: लिनक्स

क्या तुम लोग एक्सएमएल पार्स नहीं उत्पन्न करने के लिए प्रयोग करते हैं?

अब तक मैं इसे खुद उत्पन्न करने के लिए फोरडेकर के मार्ग पर जा रहा हूं - यह एक बड़ा दस्तावेज़ नहीं है, लेकिन मुझे वास्तव में इसे सही तरीके से उत्पन्न करने के लिए एक सभ्य पुस्तकालय खोजने में बहुत परेशानी नहीं होनी चाहिए।

बढ़ावा देने के लिए, जो चीजें मैं करने में सक्षम होना चाहता हूं वह नोड नाम सेट करता है, मेरे नोड्स में विशेषताओं को सेट करता है, और इसके साथ आने वाले सभी अतिरिक्त बकवास से छुटकारा पाता है क्योंकि मुझे वास्तव में परवाह नहीं है मेरे दस्तावेज़ को उस कक्षा में वापस रखने के बारे में।

+0

मैंने एक्सएमएल जीने के लिए [libxml ++] (http://libxmlplusplus.sourceforge.net/) का उपयोग किया है, लेकिन मैं गारंटी नहीं दे सकता कि यह सबसे आसान तरीका है! :-) –

उत्तर

10

कुछ मुझे एक एक्सएमएल घोषित कर सकते हैं - लेकिन एक प्रभावी तरीका यह है कि इसे अपने पसंदीदा स्ट्रिंग आउटपुट टूल (प्रिंट, आउटपुट स्ट्रीम इत्यादि) के साथ उत्पन्न करें - यह एक बफर या फ़ाइल पर जा सकता है।

एक बार सहेजा गया - आपको वास्तव में इसे शिपिंग करने से पहले एक स्कीमा के साथ मान्य करना चाहिए।

हमारी परियोजनाओं में से एक के लिए हमारे पास प्रारंभ/अंत टैग और विशेषताओं के प्रबंधन के लिए टेम्पलेट का एक बहुत ही सरल सेट है। इन दोनों में एक स्ट्रीम आउटपुट ऑपरेटर है। यह स्रोत एक्सएमएल और डीबग उत्पन्न करना बहुत आसान बनाता है। यह एक्सएमएल पीढ़ी कोड की संरचना को एक्सएमएल की तरह दिखता है।

इसका एक फायदा यह है कि फ़ाइल में स्ट्रीमिंग करते समय आप बड़ी मात्रा में XML उत्पन्न कर सकते हैं। आप बाद में सत्यापन लागत का भुगतान करेंगे (संभावित रूप से महंगे ऑपरेशन के लिए बेहतर समय पर)।

इस तकनीक का नकारात्मक हिस्सा यह है कि यह अनिवार्य रूप से केवल आउटपुट है। यह गतिशील रूप से एक्सएमएल उपभोग करने के लिए उपयुक्त नहीं है।

+0

बहुत बहुत धन्यवाद! मैंने पिछले 2-3 घंटों में वेब, न्यूज ग्रुप, आईआरसी इत्यादि को बिताया ... और पिछले 20 मिनट में मैंने एक जनरेटर बनाया जो वास्तव में मुझे इस विधि का उपयोग करने की ज़रूरत है - यह सुंदर नहीं है; काम की ज़रूरत है लेकिन यह काम करता है - thnx! – eyberg

+3

हाँ, हेरेटिक! ;) गंभीरता से हालांकि, मैं इस मार्ग पर जाने के खिलाफ सलाह दूंगा - वहां कई पुस्तकालय हैं जो आपकी एक्सएमएल में गलतियों को करने में मदद करेंगे और आपको रोक देंगे। – MattyT

+0

ठीक है, मैं बिना किसी मुद्दे के वर्षों के लिए अपना खुद का एक्सएमएल उत्पन्न कर रहा हूं। फोर्डकेकर की तरह, हमारा एक्सएमएल अपेक्षाकृत सरल है, लेकिन शायद वह जो कहता है उससे ज्यादा जटिल है। – Rob

0

कौन सा मंच? एमएसएक्सएमएल विंडोज पर एक विकल्प है। CMarkup एक और अच्छी पसंद है। यदि .NET एक विकल्प है, तो इसमें उत्कृष्ट XML समर्थन है।

+0

सीएमकैप भी बिना काम करता है। नेट आप std :: स्ट्रिंग का उपयोग करने के लिए इसे बना सकते हैं या एमएफसी सीएसटींग। यह स्मृति में संपूर्ण दस्तावेज़ बनाता है यदि यह कोई समस्या है –

0

मैंने वास्तव में ऐसा करने के लिए बूस्ट क्रमबद्धता की कोशिश नहीं की है, लेकिन जैसा कि मैं इसे समझता हूं, यदि आप अपने विकल्पों को बहुत सावधानीपूर्वक चुनते हैं, तो आप स्कीमा में कई अलग-अलग विकल्प सेट कर सकते हैं (जैसे पॉइंटर फ्लाईवेटिंग को रोकने और तत्व को सेट करना कुछ प्रकार के लिए नाम)

47

मैंने हाल ही में एक्सएमएल कोड बनाने के लिए एक्सएमएल पुस्तकालयों का एक गुच्छा की समीक्षा की।

कार्यकारी सारांश: मैंने TinyXML++ के साथ जाना चुना।

TinyXML ++ सभ्य सी ++ वाक्यविन्यास है, परिपक्व TinyXML सी पुस्तकालयों पर बनाया गया है, मुक्त & ओपन सोर्स (एमआईटी लाइसेंस) और छोटा है। संक्षेप में, यह नौकरी जल्दी से करने में मदद करता है।

Document doc; 
Node* root(doc.InsertEndChild(Element("RootNode"))); 
Element measurements("measurements"); 
Element tbr("TotalBytesReceived", 12); 
measurements.InsertEndChild(tbr); 
root->InsertEndChild(measurements); 

कौन सा पैदा करता है:

<RootNode> 
    <measurements> 
     <TotalBytesReceived>12</TotalBytesReceived> 
    </measurements> 
</RootNode> 

मैं इसके साथ काफी खुश किया गया है यहाँ एक त्वरित टुकड़ा है।

मैंने कई अन्य लोगों की समीक्षा की; यहां कुछ बेहतर दावेदार हैं:

Xerces: राजा-पिताजी। सब कुछ (विशेष रूप से जब Xalan के साथ संयुक्त) लेकिन हेवीवेट और उपयोगकर्ता पर मेमोरी प्रबंधन को मजबूर करता है।

RapidXML: पार्स करने (यह एक इन-सीटू पार्सर है और तेजी है), लेकिन डोम के लिए नोड्स जोड़ने के बाद से पीढ़ी के लिए अच्छा नहीं स्मृति प्रबंधन की आवश्यकता है के लिए बढ़िया है।

Boost.XML (प्रस्ताव): महान - शक्तिशाली, उत्कृष्ट सी ++ वाक्यविन्यास दिखता है। हालांकि यह समीक्षा प्रक्रिया के माध्यम से अभी तक नहीं चला है, असमर्थित है और इंटरफ़ेस अच्छी तरह से बदल सकता है। वैसे भी इसका इस्तेमाल किया। बूस्ट में इसकी स्वीकृति के लिए तत्पर हैं।

Libxml (++): बहुत अच्छा; शक्तिशाली, सभ्य वाक्यविन्यास। लेकिन यह बड़ा हैश यदि आप कर रहे हैं एक्सएमएल उत्पन्न कर रहा है और glibmm लाइब्रेरी (ustring के लिए) से जुड़ा हुआ है। अगर हम लिनक्स पर केवल थे (जैसे स्वयं?) मैं गंभीरता से विचार करता हूं।

XiMOL: अद्वितीय स्ट्रीम-आधारित लाइब्रेरी। यह हमारी जरूरतों के लिए थोड़ा सा सरल था लेकिन मूल एक्सएमएल पीढ़ी के लिए आपको यह काफी उपयोगी लगेगा। धारा वाक्यविन्यास काफी साफ है।

उम्मीद है कि कुछ उपयोग में कुछ है!

+0

TinyXML ++ समस्या पृष्ठ को देखते हुए, ऐसा लगता है कि इसमें कुछ मेमोरी लीक हैं। क्या आपने इसका अनुभव किया है? – metal

+0

@mlimber मैं इसे नियमित रूप से नियमित रूप से उपयोग करता हूं और नहीं, लेकिन मैं केवल अपेक्षाकृत छोटे दस्तावेज़ों के लिए इसका उपयोग करता हूं –

+5

एचएम, सबसे निचले तत्व को देखते हुए मुझे संदेह है कि आउटपुट और कोड मैच। :-) –

0

मैं tinyXml ++ का उपयोग करता हूं और यह ऊपर पोस्ट किए गए XML को बनाना बहुत आसान बनाता है। यह इसे एक कमांड में फ़ाइल में भी सहेज लेगा, लेकिन मुझे यह पता नहीं चल सकता कि इसे बफर में कैसे सहेजना है।

9

बूस्ट। प्रॉपर्टी ट्री एक्सएमएल उत्पन्न करने का एक अच्छा और सीधा तरीका है - खासकर यदि आप बूस्ट का उपयोग कर रहे हैं।

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 

using boost::property_tree::ptree; 
using boost::property_tree::write_xml; 
using boost::property_tree::xml_writer_settings; 

int wmain(int argc, wchar_t* argv[]) { 
    char* titles[] = {"And Then There Were None", "Android Games", "The Lord of the Rings"}; 

    ptree tree; 
    tree.add("library.<xmlattr>.version", "1.0"); 
    for (int i = 0; i < 3; i++) { 
     ptree& book = tree.add("library.books.book", ""); 
     book.add("title", titles[i]); 
     book.add("<xmlattr>.id", i); 
     book.add("pageCount", (i+1) * 234); 
    } 

    // Note that starting with Boost 1.56, the template argument must be std::string 
    // instead of char 
    write_xml("C:\\Users\\Daniel\\Desktop\\test.xml", tree, 
     std::locale(), 
     xml_writer_settings<char>(' ', 4)); 

    return 0; 
} 

जिसके परिणामस्वरूप एक्सएमएल इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?> 
<library version="1.0"> 
    <books> 
     <book id="0"> 
      <title>And Then There Were None</title> 
      <pageCount>234</pageCount> 
     </book> 
     <book id="1"> 
      <title>Android Games</title> 
      <pageCount>468</pageCount> 
     </book> 
     <book id="2"> 
      <title>The Lord of the Rings</title> 
      <pageCount>702</pageCount> 
     </book> 
    </books> 
</library> 

एक बात विशेष रूप से अच्छा है कि पथ डॉट अलग है कि आप परोक्ष बनाने के लिए अनुमति देते हैं

निम्नलिखित पूर्ण उदाहरण कार्यक्रम है रास्ते में सभी नोड्स। documentation अपेक्षाकृत कम है, लेकिन ptree.hpp के साथ आपको यह पता चलता है कि यह कैसे काम करता है।

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