2012-10-25 37 views
2

讓我首先表達我的理解,即我想要做的是而不是正常,也不是典型的建議。我完全知道在正常的XML中,"字符是保留的。如何停止QXmlStreamWriter轉義引號?

我使用Qt應用程序生成要在Visual Studio 2010中使用的.vcxproj文件。我利用QXmlStreamWriter類來編寫項目文件所需的XML。但是,由於Microsoft不遵守XML標準,我遇到了一個問題。

CustomBuild元素中,用戶需要指定構建文件的命令。在Visual Studio中的Qt項目的情況下,你最終是這樣的:

<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o "..\myproj\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_SQL_LIB -DQT_OPENGL_LIB -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_SVG_LIB "-I." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtXml" "-I$(QTDIR)\include\QtSql" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\Qt3Support" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtTest" "-I..\myproj"</Command> 

難吃,但就是生活,尤其是與微軟合作。 Unfortunatey,我QXmlStreamWriter對象產生這種(完全兼容)輸出:

<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe&quot; &quot;%(FullPath)&quot; -o &quot;..\myproj\moc_%(Filename).cpp&quot; -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_SQL_LIB -DQT_OPENGL_LIB -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_SVG_LIB &quot;-I.&quot; &quot;-I$(QTDIR)\include&quot; &quot;-I$(QTDIR)\include\QtCore&quot; &quot;-I$(QTDIR)\include\QtGui&quot; &quot;-I$(QTDIR)\include\QtXml&quot; &quot;-I$(QTDIR)\include\QtSql&quot; &quot;-I$(QTDIR)\include\QtOpenGL&quot; &quot;-I$(QTDIR)\include\Qt3Support&quot; &quot;-I$(QTDIR)\include\QtSvg&quot; &quot;-I$(QTDIR)\include\QtTest&quot; &quot;..\myproj&quot;</Command> 

當然,Visual Studio是沒有深刻的印象。我在這裏有什麼選擇?我大概可以讀迴文件並且避開它,但這聽起來並不是特別有效或智能。

回答

3

我想你是用QXmlStreamWriter::writeCharacters或者類似的來寫出包含"的字符串?

也許,在調用該函數之前,您可以檢查您要寫入的字符串是否包含"。如果是這樣,你可以在"把它分解,通過寫QXmlStreamWriter::writeCharacters"人物,並直接寫入"到底層QIODevice

QString maybeHasQuotes = ...; 
QStringList parts = maybeHasQuotes.split('"'); 
while (!parts.isEmpty()) { 
    QString part = parts.takeFirst(); 
    writer.writeCharacters(part); 
    if (!parts.isEmpty()) { 
     writer.device()->putChar('"'); 
    } 
} 
+0

是的,我使用'writeCharacters()'方法。這是一個很好的主意。我會在早上工作並跟進。 –

+0

賓果。那樣做了。爲了完成,我添加了自己的答案。 –

1

直接繞過到QIODevice @rohanpm的方式建議是辦法走。

我分類爲QXmlStreamWriter,並添加了一個寫引用字符串的方法。

customstreamwriter.h

#ifndef CUSTOMSTREAMWRITER_H 
#define CUSTOMSTREAMWRITER_H 

#include <QXmlStreamWriter> 

class CustomStreamWriter : public QXmlStreamWriter 
{ 
public: 
    CustomStreamWriter(QIODevice *device); 
    void writeQuotedCharacters(QString text); 
}; 

#endif // CUSTOMSTREAMWRITER_H 

customstreamwriter.cpp

#include "customstreamwriter.h" 

CustomStreamWriter::CustomStreamWriter(QIODevice *device) : 
    QXmlStreamWriter(device) 
{ 
} 

void CustomStreamWriter::writeQuotedCharacters(QString text) { 
    QStringList parts = text.split('"'); 
    while (!parts.isEmpty()) { 
     QString part = parts.takeFirst(); 
     writeCharacters(part); 
     if (!parts.isEmpty()) { 
      device()->putChar('"'); 
     } 
    } 
} 

而不是使用QXmlStreamWriter的,我用我的CustomStreamWriter代替。唯一的區別是,當我需要寫一個帶引號的字符串時,我打電話給我的writeQuotedCharacters()方法。