2010-07-14 12 views
8

मान लीजिए कि हम निम्न XML दस्तावेज़ करते हैं:QString/कंटेनर वर्ग के लिए QDomElement परिवर्तित

<root> 
    <options> 
     ... 
    </options> 
    <children> 
     <child name="first">12345</child> 
     <child name="second"> 
      <additionalInfo>abcd</additionalInfo> 
    </children> 
</root> 

मैं "बच्चा" नोड्स के एक स्ट्रिंग प्रतिनिधित्व प्राप्त है और उन्हें एक सरणी में संलग्न करने के लिए (मैं डॉन 'चाहते हैं टी एक्सएमएल सिंटैक्स को खोना नहीं चाहता है .text() एक विकल्प नहीं है)। उदाहरण के लिए, पहले बच्चे देखो की तरह होगा:

QString child = "<child name="first">12345</child>"; 

मैं तत्वों प्राप्त करने के लिए निम्न कोड का प्रयोग किया:

QDomDocument doc; 
QDomElement element; 
element = xml->documentElement(); 
if(element.isNull() == false) 
{ 
    element = element.firstChildElement("children"); 
    if(element.isNull()) return; 

    element = element.firstChildElement("child"); 
    while(element.isNull() == false) 
    { 
     doc = element.toDocument(); 
     if(doc.isNull() == false) 
     { 
      // save string into array 
      array.append(doc.toString()); 
     } 
     element = element.nextSiblingElement("child"); 
    } 
} 

समस्या यह है कि doc.isNull रिटर्न हमेशा गलत है (लगता है कि मैं ' मैं दस्तावेज़ में दस्तावेज़ को रूपांतरित करने में असमर्थ हूं)। क्या कोई तरीका है कि मैं इसे कैसे कर सकता हूं?

संपादित करें:

मुझे लगता है कि QString जोड़ना चाहते हैं यहाँ अनिवार्य नहीं है। मूल रूप से किसी भी वर्ग जिसे बाद में डेटा पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है ठीक है (मैं इन नोड्स को सहेज दूंगा और बाद में अन्य ऑब्जेक्ट्स को प्रारंभ करने के लिए उनका उपयोग करूंगा)। महत्वपूर्ण बात यह है कि जब भी मूल दस्तावेज़ नष्ट हो जाता है तब भी मुझे उन मानों तक पहुंचने में सक्षम होना चाहिए। उदाहरण के लिए, उन तत्वों को सीधे कुछ सरणी (जैसे QList) पर संग्रहीत करना संभव है, जिसका उपयोग बाद में उन तक पहुंचने के लिए किया जा सकता है।

उत्तर

12

मैं अपने खुद के प्रश्न का उत्तर जोड़ देंगे। कोई विचार क्यों नहीं, लेकिन ऐसा लगता है कि मैंने प्रलेखन में निम्न फ़ंक्शन को याद किया।

void QDomNode::save (QTextStream & str, int indent) const

यह बहुत ज्यादा सब मैं एक स्ट्रिंग, उदा में एक नोड बदलने की आवश्यकता है: उत्तर के लिए

QString str; 
QTextStream stream(&str); 
QDomNode node = xml->documentElement().firstChildElement("child"); 

node.save(stream, QDomNode::CDATASectionNode /* = 4 *); 

// process str 
+1

विपरीत ऑपरेशन के बारे में क्या? स्ट्रिंग को देखते हुए एक QDomNode उत्पन्न होता है जिसे बाद में मौजूदा QDomDocument में जोड़ा जा सकता है? – Pierluigi

+0

@Pierluigi, यह स्वयं ही एक प्रश्न होना चाहिए। यह बहुत शामिल है। आप 'QDomDocument' बनाते हैं,' setContent() 'का उपयोग करें, फिर किसी अन्य दस्तावेज़ में परिणाम की प्रतिलिपि बनाने के लिए 'QDomDocumentFragment' का उपयोग करें ... –

+0

टिप्पणी/* = 4 * बंद नहीं है। तो यहाँ वाक्यविन्यास त्रुटि। –

0

चूंकि आपको XML प्रारूप की आवश्यकता है, इसलिए आपको QDomElement या QDomDocument की आवश्यकता नहीं है। XML दस्तावेज़ों में संग्रहीत डेटा प्राप्त करने के लिए QDomElement और QDomDocumentका उपयोग किया जाता है।

आपको बस एक साधारण फ़ाइल ट्रैवर्सल की आवश्यकता है।

ओपन फ़ाइल का उपयोग

bool QFile::open (OpenMode mode) [virtual] 

आप से फ़ाइल की संपूर्ण सामग्री पढ़ सकते हैं,

QByteArray QIODevice::readAll() 

जो आप इसे एक QString को सौंप सकते हैं।

उदा के लिए,

QString entireContents = xmlFile->readAll(); 

तो फिर तुम

QStringList QString::split (const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const 

अब प्रत्येक सूचकांक एक्सएमएल फ़ाइल में प्रत्येक पंक्ति से मेल खाती है का उपयोग कर न्यू लाइन\n चरित्र पर आधारित संपूर्ण सामग्री विभाजित कर सकते हैं। आप इसके माध्यम से जा सकते हैं और ब्याज की वांछित लाइनें प्राप्त कर सकते हैं।

आशा है कि यह मदद करता है ...

+0

Ty। मैं उन QDom * कक्षाओं का उपयोग कर रहा हूं क्योंकि मुझे चर्चा किए गए ऑपरेशन से पहले बहुत अधिक डेटा पार्स/प्राप्त करने की आवश्यकता है। Thats क्यों मैं उत्सुक हूँ अगर यह उन वर्गों (या किसी भी QtXml कक्षाओं) के माध्यम से किया जा सकता है। मुझे पता है कि "हाथ से" दस्तावेज़ को पार्स करना संभव है और यह एक साधारण दस्तावेज़ के साथ काम कर सकता है। हालांकि, मेरी स्थिति में दस्तावेज़ बहुत जटिल हो सकता है और मुझे कई स्थानों पर समान संचालन की आवश्यकता है। असल में मुझे पता है कि एक्सएमएल पेड़ के कुछ स्तर पर एक नोड होना चाहिए और मुझे इसके तहत हर शाखा प्राप्त करने की आवश्यकता है। – Routa

0

खैर मुझे लगता है कि आप नहीं कर सकते excactly क्या आप क्यूटी एक्सएमएल वर्गों के साथ करना चाहते हैं, लेकिन यह बस स्ट्रिंग अपने आप को फिर से संगठित करने के लिए संभव होना चाहिए (शायद 100 में मूल मिलान नहीं %, लेकिन एक ही अर्थ के साथ), क्यूटी एक्सएमएल कक्षाओं के तरीकों के आधार पर।

संपादित करें: छोटे कोड का टुकड़ा जो बात (untested) कर सकते हैं:

QString domElementToRawXML(const QDomElement& elem) 
{ 
    QString head = "<"+elem.tagName(); 
    QDomNamedNodeMap attrs = elem.attributes(); 
    for(int i = 0; i<attrs.size(); ++i) 
    { 
     QDomAttr attr = attrs.item(i).toAttr(); 
     head += 
      QString::fromLatin1(" %0=\"%1\"") 
      .arg(attr.name()) 
      .arg(attr.value()); 
    } 
    head += ">"; 
    return head + elem.text() + "</"+elem.tagName()+">"; 
} 
+0

उत्तर के लिए धन्यवाद। इन उत्तरों के आधार पर ऐसा लगता है कि मुझे नोड्स को सहेजने की रणनीति को छोड़ना है (एक स्ट्रिंग के रूप में) और कुछ और पता लगाना। – Routa

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