2011-07-06 121 views
1

我需要在QT中創建XML文件,但我不使用QT XML類來創建XML數據,但我手動創建字符串(其中包含XML)並將其寫入文件,原因不使用QT XML類,我需要保留屬性的順序,但如果我使用QT XMl類,它按隨機順序編寫屬性。在QT QString到XML

一切都很好,直到現在,直到我得到的HTML文本被寫爲XML中的標記值。 我需要寫HTML數據作爲QT XML類經常爲e.g「這是<測試數據>」應寫爲「這是& LT:測試數據& GT」。在這裏我已經取代了「;」用「:」來理解目的。

任何人都可以幫我使用QString中的任何函數,它可以在寫入文件或寫入文件之前檢測XMl並將其轉換嗎?

+1

注意,XML規範指出[屬性的順序並不重要(http://www.w3.org/TR/xml/# sec-starttags),因此XML處理程序在處理XML內容時不需要維護順序。 *修復*(不是解決方法)將正確讀取XML - 如果您有權訪問執行該操作的代碼。 – larsmoa

+0

你好,謝謝,我知道屬性的順序並不重要,但是我從我的項目創建的XML文件被其他項目使用(可能不會在QT中創建),因此他們要求我保留屬性順序。所以我不得不現在去做。 – maxchirag

+0

@maxchirag:你試過QXmlStreamWriter嗎?當您調用writeAttribute()時,它直接寫入底層I/O設備,因此這些屬性將按您在代碼中編寫的順序顯示。 –

回答

0

由於你的問題是你不能使用QT XML類,因爲它的行爲,我假設你在你的項目中使用QT XML模塊沒有問題。唯一的辦法,我可以考慮檢測,驗證代碼,並驗證它是否爲有效的XML(僅語法)。

QString test = "<TestData>Valid XML</TestData>"; 
QString wrapper_start = "<?xml version=\"1.0\"?><dummyrootelement>"; 
QString wrapper_end = "</dummyrootelement>"; 
QDomDocument document; 
if(document.setContent(wrapper_start + test + wrapper_end)) { 
    // Valid XML, handle test here 
} else { 
    // Probably not valid XML 
} 

你需要wrapper_start和wrapper_end變量的原因是因爲你可以在兩者之間進行處理XML片段,你可能會考慮將此作爲XML需要進行處理:

<TestData>Data1</TestData><TestData>Data2</TestData> 

但解析錯誤將會造成這種情況,因爲XML文檔需要一個根元素。

另外,請注意,上述方法不是我推薦的方法,但我已經提到過,因爲我理解任何需要維護遺留系統的人的痛苦和同情。如果您的應用程序依賴於屬性的排序,我強烈建議您至少考慮修改應用程序的體系結構。

+0

Hello Rohan,感謝您的評論,但首先是,在我的項目中,我們使用完整的XML,所以我們沒有與我們的本機文件有關的問題,它只是我的工具生成的一些XML文件的問題(作爲輸出)其他工具。由於這些工具限制,我們使用字符串手動編寫XML。所以我必須確保我的工具寫入的文件是有效的xml並保留屬性的順序。你有什麼建議可以幫助檢測到這個問題,但我如何真正解決它? – maxchirag

+0

如果您注意到,如果您注意到,在標記爲「// Valid XML,此處處理測試」的部分中,您可以根據需要處理XML字符串,因爲字符串根本沒有被修改過並且屬性順序不變。現在唯一的事情是,你知道這個變量確實是XML。 –

4

檢查QXmlStreamReaderQXmlStreamWriter類。它們在QtCore中,對於XML處理非常有用。

你應該做這樣的事情:

QString string; 
QXmlStreamWriter writer(&string); 
// use QXmlStreamWriter class to generate the XML 
writer.setAutoFormatting(true); 
writer.writeStartDocument(); 
... 
writer.writeStartElement("html"); 
writer.writeStartElement("a"); 
writer.writeAttribute("href", "http://example.com/"); 
writer.writeCharacters("My wonderful link"); 
writer.writeEndElement(); // a 
writer.writeEndElement(); // html 
... 
writer.writeEndDocument(); 
+0

oppss ...對不起,我忘了提及我使用Qt版本4.1.4由於項目原因,QXmlStreamReader可能不會在Qt4.3之前被引入....感謝您的答覆。 – maxchirag

+0

@maxchirag:你爲什麼要用這個真正老的圖書館? – Naszta