3

xerces-c を使用して XML ドキュメントを解析し、DOMPrint の例のようなファイルに正常に書き込むことができますが、これを配列に格納することはできません。シリアライザーを引き続き使用する必要があることをオンラインで確認しましたが、何を変更すればよいかわかりません。明らかに、LocalFileFormatTarget を使用する代わりに、何か他のものを使用する必要がありますが、オンラインで MemBufFormatTarget のリファレンスを探しても、その使用方法の手がかりが得られません。xerces-c を使用して xml ドキュメントを文字列にするにはどうすればよいですか?

4

1 に答える 1

3

次のようなXMLFormatTargetクラスを使用して、出力を文字のバッファーに入れます。

class LStringXMLFormatTarget : public XMLFormatTarget
{
public:
LStringXMLFormatTarget()
{
    m_pBuffer = NULL;
    m_nTotal = 0;
}

char*       GetBuffer()
{
    return m_pBuffer;
}

ULONG       GetLength()
{
    return m_nTotal;
}

virtual void writeChars(const XMLByte* const toWrite, const XMLSize_t count, XMLFormatter* const formatter)
{
    if(toWrite)
    {
        char*   pTmp = new char[m_nTotal + count + 1];

        if(m_pBuffer)
        {
            memcpy(pTmp, m_pBuffer, m_nTotal);
            delete m_pBuffer;
        }

        memcpy(&pTmp[m_nTotal], toWrite, count);

        m_nTotal += count;
        m_pBuffer = pTmp;

        if(m_pBuffer)
            m_pBuffer[m_nTotal] = 0;
    }
}

protected:
    char*       m_pBuffer;
    ULONG       m_nTotal;
};

出力エンコーディングもマルチバイト文字で構成されている可能性があるため、これは意図的に単一文字のバッファであることに注意してください。

DOMLSOutputおよびDOMLSSerializerオブジェクトと一緒に使用します。

DOMLSOutput*  pLSOutput = impl->createLSOutput();

if(pLSOutput)
{
    pLSOutput->setByteStream(&stringTarget);
    pSerializer->write(doc, pLSOutput);
}

ps writeChars()のより効率的な実装のために、常に新しいバッファをコピーして割り当てるのではなく、代わりに、メモリのいくつかのチャンクの前に十分な大きさのメモリブロックを予約するか、書き込みを行う場合があることに注意してください。 XMLFormatTargetがどのように機能するかを示します。

于 2011-06-26T11:13:28.383 に答える