2012-12-19 26 views
6

Çıktıların biçimlendirilmediği bir xml dosyası var. Bu, tüm çıktıların tek bir satırda olduğu anlamına gelir, ancak etiketi etiketle kırmak istiyorum. ör içinXML dosyasını C++ veya Qt biçiminde biçimlendirme

-

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

Ama bu :: gibi yapmak istiyorum

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

bu xml dosya zaten olduğundan XML dosyası yazma ederken bunu yapmak için önermek değil ama şimdi biçimlendirmek zorunda Lütfen Yukarıda da belirtildiği gibi .

Şimdiden teşekkürler. Eğer Qt kullanıyorsanız

+1

[TinyXML] ile XML Oku (http://www.grinninglizard.com/tinyxml/) oldukça baskı bu durumda varsayılan, TiXMLPrinter ile çıktısını. –

cevap

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

, sen QXmlStreamReader ile okumak ve QXmlStreamWriter ile yazabilir veya QDomDocument olarak ayrıştırmak ve QString için onu geri dönüştürebilir. Hem QXmlStreamWriter ve QDomDocument destek biçimlendirmesi.

0

çıktı için> < her örneği arasında tek bir karakter ekleyebilir ++ C Yararlanma: n < \> için <> değiştirerek her etiket yeni üzerine yazdırılacaktır (bu Yenisatır için olmayan baskı karakter ekler) hat. Ancak, yukarıda belirtildiği gibi, bunun için API yolları vardır, ancak konsol çıkışı için önerdiğiniz şeyi yapmanın basit bir yolu veya XML'in bir metin düzenleyicisi gibi bir şeyde etiket başına yeni satırlara akması için \ n iyi çalışmalıdır. .

Eğer daha şık bir çıkışı gerekiyorsa, senin çıkışını hazırlamak veya daha ayrıntılı bir gösterimini reeqire eğer bir api kullanmak için \n (yeni satır) ve \t (sekme) kullanılarak bir yöntem kendiniz kod.

+0

Aslında yukarıdaki çıktıyı bir dosyada saklamak istiyorum. Ama bence sadece konsol için çalışacağım. Lütfen bir dosyada saklamak için bir şey önerebilir misiniz? – Kenta

+0

Dosyaya nasıl akıyorsunuz? Örneğin, xml dizginizi bir metin dosyası olarak kaydettiğinizde, \ n' da çalışır. Bu şekilde de iyi olmalısınız. Xml çıktınızı güzelleştirmeyi düşündüğüm ek bir API kullanabilirsiniz, ancak kendi sisteminizi yazmanın avantajları, her şeyin nasıl çalıştığını görebilmeniz; ve amaçlarınız için ihtiyaç duyduğunuz şekilde küçük ve verimli bir sistem yazabilirsiniz. Kurslar için atlar gerçekten, ama daha ayrıntılı bir cevaba ihtiyacınız varsa, elimden gelenin en iyisini yapacağım, sadece içeriğin dosyaya nasıl kaydedildiğine dair biraz fazla bilgiye ihtiyacım var. :) – GMasucci

1

QT'ye dayanmayan basit ve sağlam bir çözüm istiyorsanız, libxml2'yi kullanabilirsiniz. (Yine QT kullanıyorsanız, sadece Frank Osterfeld söylediklerini kullanın.)

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

benim C++ wrapper of libxml2 ilgilenir misiniz?

Düzenleme: Eğer bellekte XML dizesi var olur, ayrıca istediğini yapması gerektiğini bir QXmlStreamReader ve QXmlStreamWriter kullanma xmlReadDoc ... But it doesn't stop there.

5

kullanabilir . QXmlStreamWriter::setAutoFormatting(true), XML'yi farklı satırlarda biçimlendirecek ve doğru girintiyi kullanacaktır. QXmlStreamReader::isWhitespace() ile etiketler arasındaki gereksiz boşluğu filtreleyebilirsiniz.

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

Cevap verdiğiniz için teşekkür ederiz.Fakat ikinci iterasyon sırasında kırılması. – Kenta

+0

Kırma ile ne demek istiyorsun? Programınız çöküyor mu? Yoksa beklenmedik bir çıktı mı alıyorsunuz? Bu test programı istediğiniz çıktıyı yazdıracaktır: https://gist.github.com/4343585 – stijnvn

+0

ya program çöküyor. – Kenta

İlgili konular