C++ 如何阻止QXmlStreamWriter转义引号?

C++ 如何阻止QXmlStreamWriter转义引号?,c++,xml,qt,escaping,C++,Xml,Qt,Escaping,首先,让我表达我的理解,即我试图做的事情是不正常的,也不是典型的明智之举。我完全知道,在普通XML中,“字符是保留的 我正在使用Qt应用程序生成要在Visual Studio 2010中使用的.vcxproj文件。我正在利用QXmlStreamWriter类来编写项目文件所需的XML。但是,由于Microsoft不遵守XML标准,我遇到了一个问题 在CustomBuildelements中,用户需要指定用于生成文件的命令。对于Visual Studio中的Qt项目,您将得到如下结果: <

首先,让我表达我的理解,即我试图做的事情是不正常的,也不是典型的明智之举。我完全知道,在普通XML中,
字符是保留的

我正在使用Qt应用程序生成要在Visual Studio 2010中使用的
.vcxproj
文件。我正在利用
QXmlStreamWriter
类来编写项目文件所需的XML。但是,由于Microsoft不遵守XML标准,我遇到了一个问题

CustomBuild
elements中,用户需要指定用于生成文件的命令。对于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>

当然,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('"');
    }
}

直接绕过
QIODevice
。@rohanpm建议的方法就是走这条路

我将
QXmlStreamWriter
子类化,并添加了一个方法来编写带引号的字符串

自定义流编写器
我没有使用
QXmlStreamWriter
,而是使用我的
CustomStreamWriter
。唯一的区别是,当我需要编写带引号的字符串时,我调用我的
writeQuotedCharacters()
方法。

是的,我使用的是
writeCharacters()
方法。这是个不错的主意。我会在早上上班时试一试,然后跟进。宾果。成功了。为了完整起见,我添加了自己的答案。
QString maybeHasQuotes = ...;
QStringList parts = maybeHasQuotes.split('"');
while (!parts.isEmpty()) {
    QString part = parts.takeFirst();
    writer.writeCharacters(part);
    if (!parts.isEmpty()) {
        writer.device()->putChar('"');
    }
}
#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('"');
        }
    }
}