4

まず、私がやろうとしていることは正常ではなく、通常は適切にアドバイスされていないという私の理解を表明することから始めましょう. "通常の XML では、文字が予約されていることは十分承知しています。

.vcxprojQt アプリケーションを使用して、Visual Studio 2010 で使用するファイルを生成しています。このクラスを利用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&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 は感銘を受けません。ここでのオプションは何ですか? おそらくファイルを読み戻してエスケープを解除することもできますが、それは特に効率的でも賢くもありません。

4

2 に答える 2

5

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('"');
    }
}
于 2012-10-26T02:39:17.957 に答える
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にmyを使用しCustomStreamWriterます。唯一の違いは、引用符で囲まれた文字列を記述する必要があるときに、writeQuotedCharacters()メソッドを呼び出すことです。

于 2012-10-26T20:22:44.240 に答える