DOMDocument для строки xerces-c - PullRequest
       13

DOMDocument для строки xerces-c

3 голосов
/ 08 декабря 2010

Я проанализировал XML-документ с помощью xerces-c и могу успешно записать его в файл, такой как пример DOMPrint, но не могу сохранить его в массиве.Я вижу в Интернете, что мне все еще следует использовать сериализатор, но я не уверен, что изменить.Очевидно, что вместо использования LocalFileFormatTarget я должен использовать что-то другое, но поиск в Интернете ссылки на MemBufFormatTarget не дает ни малейшего представления о том, как ее использовать.Как я могу получить XML-документ в строку с помощью xerces-c?

1 Ответ

3 голосов
/ 26 июня 2011

Используйте класс 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);
}

p.s. Обратите внимание, что для более эффективной реализации writeChars () не копируйте и не выделяйте всегда новый буфер, но вместо этого вы можете зарезервировать достаточно большой блок памяти или записать его в несколько фрагментов памяти ... Эта реализация здесь просто для демонстрации как работает XMLFormatTarget.

...