2010-12-08 4 views
3

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

ответ

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); 
} 

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