c – 如何阻止QXmlStreamWriter转义引号?

首先让我表达一下我的理解,即我正在尝试做的事情不正常,通常也不建议.我完全清楚,在普通的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>

但是很幸运,尤其是微软.不幸的是,我的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并没有给人留下深刻的印象.我有什么选择?我可能会回读文件并取消它,但这听起来不是特别有效或聪明.

解决方法:

我猜你正在使用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('"');
    }
}
上一篇:mysql 5.5无效的转义序列java


下一篇:输出在我的PHP中转义(html标签呈现原样)