首先让我表达一下我的理解,即我想要做的是不正常,通常也不建议。我完全清楚,在普通的XML中,"
字符是保留的。
我正在使用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>
哎呀,但 c'est la vie ,尤其是微软。不幸的是,我的QXmlStreamWriter
对象产生了这个(完全兼容)输出:
<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" "..\myproj"</Command>
自然,Visual Studio没有留下深刻印象。我有什么选择?我可能会回读文件并取消它,但这听起来不是特别有效或聪明。
答案 0 :(得分:4)
我猜您使用QXmlStreamWriter::writeCharacters
或类似内容来编写包含"
的字符串?
也许,在调用该函数之前,您可以检查您要编写的字符串是否包含"
。如果是,您可以将其拆分为"
,通过"
写入非QXmlStreamWriter::writeCharacters
字符,然后将"
直接写入基础QIODevice
:< / p>
QString maybeHasQuotes = ...;
QStringList parts = maybeHasQuotes.split('"');
while (!parts.isEmpty()) {
QString part = parts.takeFirst();
writer.writeCharacters(part);
if (!parts.isEmpty()) {
writer.device()->putChar('"');
}
}
答案 1 :(得分:1)
以@rohanpm建议的方式直接绕过QIODevice
是要走的路。
我将QXmlStreamWriter
子类化,并添加了一种编写引用字符串的方法。
#ifndef CUSTOMSTREAMWRITER_H
#define CUSTOMSTREAMWRITER_H
#include <QXmlStreamWriter>
class CustomStreamWriter : public QXmlStreamWriter
{
public:
CustomStreamWriter(QIODevice *device);
void writeQuotedCharacters(QString text);
};
#endif // CUSTOMSTREAMWRITER_H
#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()
方法。