2013-06-19 87 views
1

我用QXmlStreamWriter創建了一個xml文件,然後我想在關閉xml文件之前每次添加一個塊。 但是,我想要做的是將塊添加到文件的結尾,並附帶一個startDocument,因此在每一個添加中我都有一個XML頭,爲此我在讀取文檔時出錯,程序讀取第一個塊當它進入到第二塊,它讓我「不是在文件STRAT XML聲明:」這是我的文件:如何使用QXmlStreamWriter在XML文件中添加節點?

<?xml version="1.0" encoding="UTF-8"?> 
<Fiche_Du_Patient> 
<INFORMATIONS_DU_PATIENT> 
<Hopital>a </Hopital> 
    <Num_dossier>b</Num_dossier> 
    <Nom_et_prenom>c</Nom_et_prenom> 
    <Date_de_naissance>11111</Date_de_naissance> 
    <Sex>F </Sex> 
    <Age>26</Age> 
    <Date_examen>22222</Date_examen> 
    <Medecin_traitant></Medecin_traitant> 
    <Rapport></Rapport> 
</INFORMATIONS_DU_PATIENT> 
<NUMERO_SLICE> 
    <Num_Slice>1</Num_Slice> 
    <COORDONEES> 
    <X1>7.32896</X1> 
    <Y1>10.6362</Y1> 
    <X2>8.96937</X2> 
    <Y2>9.28687</Y2> 
    </COORDONEES> 
    <DISTANCE> 
    <Distance_en_cm>2.1241</Distance_en_cm> 
    </DISTANCE> 
    <ANGLE> 
    <Angle>7</Angle> 
    </ANGLE> 
</NUMERO_SLICE> 
</Fiche_Du_Patient> 
<?xml version="1.0" encoding="UTF-8"?> 
    <NUMERO_SLICE> 
    <Num_Slice>2</Num_Slice> 
    <COORDONEES> 
    <X1>7.80521</X1> 
    <Y1>10.3452</Y1> 
    <X2>9.49854</X2> 
    <Y2>9.525</Y2> 
    </COORDONEES> 
    <DISTANCE> 
    <Distance_en_cm>1.88152</Distance_en_cm> 
    </DISTANCE> 
    <ANGLE> 
    <Angle>1</Angle> 
    </ANGLE> 
</NUMERO_SLICE> 
<?xml version="1.0" encoding="UTF-8"?> 
    <NUMERO_SLICE> 
    <Num_Slice>3</Num_Slice> 
    <COORDONEES> 
    <X1>6.69396</X1> 
    <Y1>10.8215</Y1> 
    <X2>9.26042</X2> 
    <Y2>9.47208</Y2> 
    </COORDONEES> 
    <DISTANCE> 
    <Distance_en_cm>2.89957</Distance_en_cm> 
    </DISTANCE> 
    <ANGLE> 
    <Angle>25</Angle> 
    </ANGLE> 
    </NUMERO_SLICE> 

這種方法是錯誤的,我想要得到的是如下:

<?xml version="1.0" encoding="UTF-8"?> 
<Fiche_Du_Patient> 
<INFORMATIONS_DU_PATIENT> 
    <Hopital>a </Hopital> 
    <Num_dossier>b</Num_dossier> 
    <Nom_et_prenom>c</Nom_et_prenom> 
    <Date_de_naissance>11111</Date_de_naissance> 
    <Sex>F </Sex> 
    <Age>26</Age> 
    <Date_examen>22222</Date_examen> 
    <Medecin_traitant></Medecin_traitant> 
    <Rapport></Rapport> 
</INFORMATIONS_DU_PATIENT> 
<NUMERO_SLICE> 
    <Num_Slice>1</Num_Slice> 
    <COORDONEES> 
     <X1>7.32896</X1> 
     <Y1>10.6362</Y1> 
     <X2>8.96937</X2> 
     <Y2>9.28687</Y2> 
    </COORDONEES> 
    <DISTANCE> 
     <Distance_en_cm>2.1241</Distance_en_cm> 
    </DISTANCE> 
    <ANGLE> 
     <Angle>7</Angle> 
    </ANGLE> 
</NUMERO_SLICE> 
<NUMERO_SLICE> 
<Num_Slice>2</Num_Slice> 
<COORDONEES> 
    <X1>7.80521</X1> 
    <Y1>10.3452</Y1> 
    <X2>9.49854</X2> 
    <Y2>9.525</Y2> 
</COORDONEES> 
<DISTANCE> 
    <Distance_en_cm>1.88152</Distance_en_cm> 
</DISTANCE> 
<ANGLE> 
    <Angle>1</Angle> 
</ANGLE> 
</NUMERO_SLICE> 
<NUMERO_SLICE> 
<Num_Slice>3</Num_Slice> 
<COORDONEES> 
    <X1>6.69396</X1> 
    <Y1>10.8215</Y1> 
    <X2>9.26042</X2> 
    <Y2>9.47208</Y2> 
</COORDONEES> 
<DISTANCE> 
    <Distance_en_cm>2.89957</Distance_en_cm> 
</DISTANCE> 
<ANGLE> 
    <Angle>25</Angle> 
</ANGLE> 
</NUMERO_SLICE> 
</Fiche_Du_Patient> 

正如你所看到的< NUMERO_SLICE>塊每增加一個新參數就重複一次。通常情況下,該塊添加在</Fiche_Du_Patient>之前,但我還沒有找到QXmlStreamWriter(我是xml中的初學者)的一種方式。我搜索了網絡,但我對此沒有任何發現。

是否存在請添加< NUMERO_SLICE>塊每次之前?

親切

+0

注意:我使用QXmlStreamWriter QXmlStreamReader,並且我有一個dom鏈接問題 – Clara

回答

3

我認爲,只有這個黑客能夠避免讀取完整的XML內存和重寫:

{ 
    QString path("/home/carlo/test/x.xml"); 
    QString ctag = "</Fiche_Du_Patient>\n"; 

    QFile file(path); 
    qint64 s = file.size(); 
    if (s > 0) { 
     file.open(QFile::ReadWrite); 
     if (file.seek(s - ctag.length())) 
      Q_ASSERT(file.pos() == s - ctag.length()); 

    } else 
     file.open(QFile::WriteOnly); 

    QXmlStreamWriter xmlWriter(&file); 
    xmlWriter.setAutoFormatting(true); 
    xmlWriter.setAutoFormattingIndent(2); 

    if (s == 0) { 
     xmlWriter.writeStartDocument(); 
     xmlWriter.writeStartElement("Fiche_Du_Patient"); 
    } 

    xmlWriter.writeStartElement("NUMERO_Patient"); 
    xmlWriter.writeTextElement("Num_Patient", "123"); 
    xmlWriter.writeTextElement("Nom_et_prenom", s > 0 ? "appending" : "creating"); 
    xmlWriter.writeTextElement("Date_de_naissance", s > 0 ? "more date" : "first date"); 
    xmlWriter.writeEndElement(); 

    if (s == 0) { 
     xmlWriter.writeEndElement(); 
     xmlWriter.writeEndDocument(); 
    } 
    else 
     QTextStream(&file) << ctag; 
} 

這產生正確的XML,但格式輸出不是最佳的(漂亮的縮進丟失)。更好的方法是解析最後的標籤,而不用硬編碼。

+1

謝謝謝謝,問題就解決了:) – Clara

0

如果你選擇繼續QXmlStreamReader /作家,你將需要:

  1. 使用QXmlStreamReader
  2. 雖然也寫出來QXmlStreamWriter

閱讀內容下面是一個例子,如果你需要做什麼。請記住,有來檢查的一些其他情況下的,像isComment(),複製屬性等:

QString xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
       "<data>" 
       "<value>1</value>" 
       "<value>2</value>" 
       "</data>"; 

QString out; 
QXmlStreamWriter writer(&out); 

QXmlStreamReader reader(xml); 
while(!reader.atEnd()) 
{ 
    if(reader.isStartDocument()) 
    writer.writeStartDocument(); 

    if(reader.isStartElement()) 
    { 
    writer.writeStartElement(reader.name().toString()); 

    // New elements are appended here 
    if(reader.name() == "data") 
    { 
     writer.writeStartElement("newValue"); 
     writer.writeCharacters("newValue"); 
     writer.writeEndElement(); 
    } 
    } 

    if(reader.isCharacters()) 
    writer.writeCharacters(reader.text().toString()); 

    if(reader.isEndElement()) 
    writer.writeEndElement(); 

    if(reader.isEndDocument()) 
    writer.writeEndElement(); 

    reader.readNext(); 
} 

qDebug() << out; 

輸出(格式化):

<?xml version="1.0"?> 
<data> 
    <newValue>newValue</newValue> 
    <value>1</value> 
    <value>2</value> 
</data> 
+0

感謝您的回答,但是在您的代碼中它缺少像這樣的文件的打開模式:if(File.Open(QFile :: ReadOnly | QFile :: Text)!)? – Clara

+0

=)。我理解你的問題是關於如何使用流讀/寫器類將新內容添加到XML數據。如果你想在QtDocumentation(網站上或通過QtCreator)上打開一個文件來查看QFile和QFileDialog,那麼QString filename = QFileDialog :: ....; QFile文件(文件名); file.open(); – Huy

+0

@惠012 我收到以下錯誤: 'QIODevice :: write(QFile,「/Users/arqam/Desktop/XMLGenrator/input/zzzz.xml」):設備未打開 QIODevice :: read(QFile 「/Users/arqam/Desktop/XMLGenrator/input/zzzz.xml」):設備@Huy我使用以下不open' – arqam