2010-05-11 7 views
16

में XML फ़ाइल को पार्स करने के लिए मुझे C++ में XML फ़ाइल को पार्स करना होगा। मैं शोध कर रहा था और इसके लिए रैपिडएक्सएमएल लाइब्रेरी मिली।RapidXML

मुझे doc.parse<0>(xml) पर संदेह है।

xml .xml फ़ाइल हो सकता है या इसे string या char * होना चाहिए?

यदि केवल string या char * ले सकते हैं तो मुझे लगता है कि मुझे पूरी फ़ाइल को पढ़ने और इसे चार सरणी में संग्रहीत करने और फ़ंक्शन में पॉइंटर को पास करने की आवश्यकता है?

क्या फ़ाइल का सीधे उपयोग करने का कोई तरीका है क्योंकि मुझे कोड के अंदर XML फ़ाइल को भी बदलने की आवश्यकता होगी।

यदि यह रैपिडएक्सएमएल में संभव नहीं है तो कृपया सी ++ में कुछ अन्य एक्सएमएल पुस्तकालयों का सुझाव दें।

धन्यवाद !!!

ashd

+1

xml_document :: parse() का तर्क xml युक्त शून्य-समाप्त स्ट्रिंग है। तो आपको बस एक फ़ाइल 2 स्ट्रिंग फ़ंक्शन बनाने की आवश्यकता है। फ़ाइल को वेक्टर बफर में पढ़ें और फिर [0] को पार्स() पर पास करें और बफर करें। – anno

+0

vtd-xml में सीए ++ पोर्ट भी है, रैपिक्सएक्सएमएल की तुलना में, vtd-xml बहुत अधिक अनुरूप, स्थिर और कुशल है ... –

उत्तर

0

manual हमें बताता है:

समारोह xml_document :: पार्स

[...] पार्स करता है शून्य समाप्त एक्सएमएल स्ट्रिंग दिया झंडे के अनुसार।

रैपिडएक्सएमएल एक फ़ाइल से चरित्र डेटा लोड करने के लिए छोड़ देता है। या तो फ़ाइल को बफर में पढ़ें, जैसे anno सुझाए गए या वैकल्पिक रूप से कुछ मेमोरी मैपिंग तकनीक का उपयोग करें। (लेकिन parse_non_destructive पहले झंडा देखें।)

7

स्वयं से सी ++ स्वयं ... लेकिन मैं एक समाधान साझा करना चाहता था।

वाईएमएमवी!

इस thread पर SiCrane को प्रोत्साहित करें: - और सिर्फ एक वेक्टर के साथ 'स्ट्रिंग' की जगह --- (धन्यवाद anno)

कृपया टिप्पणी और मुझे भी जानने में मदद! मैं बहुत ही इस

वैसे भी करने के लिए नए कर रहा हूँ, यह एक अच्छी शुरुआत के लिए काम करने के लिए लगता है:

#include <iostream> 
#include <fstream> 
#include <vector> 

#include "../../rapidxml/rapidxml.hpp" 

using namespace std; 

int main(){ 
    ifstream myfile("sampleconfig.xml"); 
    rapidxml::xml_document<> doc; 

    /* "Read file into vector<char>" See linked thread above*/ 
    vector<char> buffer((istreambuf_iterator<char>(myfile)), istreambuf_iterator<char>()); 

    buffer.push_back('\0'); 

    cout<<&buffer[0]<<endl; /*test the buffer */ 

    doc.parse<0>(&buffer[0]); 

    cout << "Name of my first node is: " << doc.first_node()->name() << "\n"; /*test the xml_document */ 


} 
+0

यह अच्छी तरह से काम करता है, लेकिन केवल अगर वेक्टर बफर 'दायरे से बाहर नहीं आता है: ए हल करने के लिए त्वरित और गंदे तरीके वेक्टर को 'स्थैतिक' कीवर्ड जोड़कर है, लेकिन मुझे नहीं लगता कि यह वास्तव में साफ है। इसे देखें: http://stackoverflow.com/questions/6363719/rapidxml-reading-from-file-what-is-wrong-here – FlipMcF

2

हम आम तौर पर एक std::string में डिस्क से एक्सएमएल पढ़ा, तो एक में इसके बारे में एक सुरक्षित प्रतिलिपि बनाने std::vector<char> जैसा कि नीचे बताया:

string input_xml; 
string line; 
ifstream in("demo.xml"); 

// read file into input_xml 
while(getline(in,line)) 
    input_xml += line; 

// make a safe-to-modify copy of input_xml 
// (you should never modify the contents of an std::string directly) 
vector<char> xml_copy(input_xml.begin(), input_xml.end()); 
xml_copy.push_back('\0'); 

// only use xml_copy from here on! 
xml_document<> doc; 
// we are choosing to parse the XML declaration 
// parse_no_data_nodes prevents RapidXML from using the somewhat surprising 
// behavior of having both values and data nodes, and having data nodes take 
// precedence over values when printing 
// >>> note that this will skip parsing of CDATA nodes <<< 
doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]); 

एक पूर्ण स्रोत कोड की जांच के लिए:

Read a line from xml file using C++

+0

वेक्टर का आकार बदलने के कारण यह बहुत धीमा है। सुपरफ्लाई जॉन के जवाब की तुलना करें, यह बहुत तेज़ है। –

26

रैपिडएक्सएमएल rapidxml_utils.hpp फ़ाइल में rapidxml::file आपके लिए ऐसा करने के लिए कक्षा के साथ आता है। कुछ की तरह:

#include "rapidxml_utils.hpp" 

int main() { 
    rapidxml::file<> xmlFile("somefile.xml"); // Default template is char 
    rapidxml::xml_document<> doc; 
    doc.parse<0>(xmlFile.data()); 
... 
} 

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