2012-12-19 9 views
6

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

उदा। -

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><Analyser> <JointDetails>    <Details><StdThickness> T </StdThickness><Thickness_num> 0.032 </Thickness_num></Details> </JointDetails></Analyser> 

लेकिन मैं इस :: जैसे कि यह क्या करना चाहते हैं

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<Analyser> 
<JointDetails> 
    <Details> 
<StdThickness> T </StdThickness> 
<Thickness_num> 0.032 </Thickness_num> 
</Details> 
    </JointDetails> 
</Analyser> 

न करें यह करने के लिए एक्सएमएल फ़ाइल writting जबकि क्योंकि यह xml फ़ाइल पहले से ही वहाँ है सुझाव है, लेकिन अब मैं इसे स्वरूपित करने के लिए है जैसा कि ऊपर उल्लेख किया गया है ।

अग्रिम धन्यवाद।

+1

[TinyXML] के साथ एक्सएमएल पढ़ें (http://www.grinninglizard.com/tinyxml/), यह पता, प्रिंट TiXMLPrinter साथ जो बहुत मुद्रण के लिए चूक। –

उत्तर

1
void format(void) 
{ 
    QDomDocument input; 

    QFile inFile("D:/input.xml"); 
    QFile outFile("D:/output.xml"); 

    inFile.open(inFile.Text | inFile.ReadOnly); 
    outFile.open(outFile.Text | outFile.WriteOnly); 

    input.setContent(&inFile); 

    QDomDocument output(input); 
    QTextStream stream(&outFile); 
    output.save(stream, 2); 
} 
2

यदि आप क्यूटी का उपयोग कर रहे हैं, तो आप इसे QXmlStreamReader के साथ पढ़ सकते हैं और इसे QXmlStreamWriter के साथ लिख सकते हैं, या इसे QDomDocument के रूप में पार्स कर सकते हैं और इसे वापस QString में परिवर्तित कर सकते हैं। QXmlStreamWriter और QDomDocument समर्थन स्वरूपण दोनों।

0

सी ++ आप एक ही चरित्र> < उत्पादन के लिए की प्रत्येक आवृत्ति के बीच जोड़ सकते हैं का उपयोग: बदलकर <>> \ n < (यह एक नई पंक्ति के लिए गैर-मुद्रण चरित्र कहते हैं) प्रत्येक टैग एक नया पर प्रिंट होगा लाइन। जैसा कि ऊपर बताया गया है, ऐसा करने के लिए एपीआई तरीके हैं, लेकिन कंसोल आउटपुट के लिए जो भी सुझाव देते हैं, उसके लिए एक आसान तरीका है, या ताकि एक्सएमएल टेक्स्ट टैग की तरह कुछ टैग में प्रति टैग की नई लाइनों पर बहती है, \ n ठीक काम करना चाहिए ।

आप एक और अधिक सुरुचिपूर्ण उत्पादन की जरूरत है, तो आप एक विधि अपने आप को \n (newline) और \t (टैब) का उपयोग कर अपने उत्पादन बाहर रखना, या एक एपीआई का उपयोग करता है, तो आप एक अधिक विस्तृत प्रतिनिधित्व reeqire को कोड कर सकते हैं।

+0

दरअसल मैं उपर्युक्त आउटपुट को फ़ाइल में संग्रहीत करना चाहता हूं। लेकिन मुझे लगता है कि \ n केवल कंसोल के लिए काम करेगा। क्या आप इसे फ़ाइल में संग्रहीत करने के लिए कुछ सुझाव दे सकते हैं। – Kenta

+0

आप फाइल करने के लिए स्ट्रीमिंग कैसे कर रहे हैं? उदाहरण के लिए यदि आप अपनी एक्सएमएल स्ट्रिंग को टेक्स्ट फ़ाइल के रूप में सहेज रहे हैं तो \ n' भी काम करेगा, इसलिए आपको भी वैसे ही ठीक होना चाहिए। आप अपने एक्सएमएल आउटपुट को सुंदर बनाने के लिए एक अतिरिक्त एपीआई का उपयोग कर सकते हैं, हालांकि, अपने सिस्टम को लिखने के फायदे यह हैं कि आप यह देखते हैं कि सब कुछ कैसे काम करता है; और, आप अपने उद्देश्यों के लिए आवश्यकतानुसार एक छोटी और कुशल प्रणाली के रूप में लिख सकते हैं। वास्तव में पाठ्यक्रमों के लिए इसके घोड़े, लेकिन यदि आपको अधिक विस्तृत उत्तर की आवश्यकता है तो मैं अपनी पूरी कोशिश करूंगा, बस कुछ अतिरिक्त जानकारी की आवश्यकता है कि आप वास्तव में फ़ाइल को सामग्री को कैसे सहेज रहे हैं। :) – GMasucci

1

यदि आप एक साधारण मजबूत समाधान चाहते हैं जो QT पर भरोसा नहीं करता है, तो आप libxml2 का उपयोग कर सकते हैं। (आप क्यूटी वैसे भी उपयोग कर रहे हैं, बस का उपयोग क्या फ्रैंक Osterfeld कहा।)

xmlDoc* xdoc = xmlReadFile(BAD_CAST"myfile.xml", NULL, NULL, 0); 
xmlSaveFormatFile(BAD_CAST"myfilef.xml", xdoc, 1); 
xmlFreeDoc(xdoc); 

मैं अपने C++ wrapper of libxml2 में आपकी रुचि कर सकते हैं?

संपादित करें: आप स्मृति में XML स्ट्रिंग है के लिए हो, तो आप भी xmlReadDoc ... But it doesn't stop there.

5

उपयोग कर सकते हैं एक QXmlStreamReader और QXmlStreamWriter का उपयोग करते हुए आप क्या चाहते हैं क्या करना चाहिए। QXmlStreamWriter::setAutoFormatting(true) एक्सएमएल को विभिन्न लाइनों पर प्रारूपित करेगा और सही इंडेंटेशन का उपयोग करेगा। QXmlStreamReader::isWhitespace() के साथ आप टैग के बीच अनावश्यक सफेद जगह फ़िल्टर कर सकते हैं।

QString xmlIn = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>" 
       "<Analyser><JointDetails>    <Details><StdThickness>" 
       " T </StdThickness><Thickness_num> 0.032 </Thickness_num>" 
       "</Details> </JointDetails></Analyser>"; 
QString xmlOut; 

QXmlStreamReader reader(xmlIn); 
QXmlStreamWriter writer(&xmlOut); 
writer.setAutoFormatting(true); 

while (!reader.atEnd()) { 
    reader.readNext(); 
    if (!reader.isWhitespace()) { 
     writer.writeCurrentToken(reader); 
    } 
} 

qDebug() << xmlOut; 
+0

उत्तर देने के लिए धन्यवाद।लेकिन यह दूसरी पुनरावृत्ति के दौरान तोड़ रहा है। – Kenta

+0

तोड़ने के साथ आपका क्या मतलब है? क्या आपका प्रोग्राम दुर्घटनाग्रस्त है? या आप अप्रत्याशित आउटपुट प्राप्त करते हैं? इस परीक्षण कार्यक्रम को आपके इच्छित आउटपुट को मुद्रित करना चाहिए: https://gist.github.com/4343585 – stijnvn

+0

या प्रोग्राम क्रैश हो रहा है। – Kenta

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