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