2010-12-08 25 views
3

J'ai analysé un document XML avec xerces-c et je peux écrire avec succès dans un fichier comme l'exemple DOMPrint, mais je ne peux pas le stocker dans un tableau. Je vois en ligne que je devrais toujours utiliser un sérialiseur, mais je ne suis pas sûr de ce qu'il faut changer. Évidemment, au lieu d'utiliser un LocalFileFormatTarget, je devrais utiliser autre chose, mais chercher en ligne une référence sur MemBufFormatTarget ne donne aucune indication sur la façon de l'utiliser. Comment puis-je obtenir un document XML dans une chaîne avec xerces-c?DOMDocument pour string xerces-c

Répondre

3

Utilisez une classe XMLFormatTarget comme celui-ci pour obtenir la sortie dans un tampon de caractères:

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

S'il vous plaît noter que ceci est par l'intention d'un tampon de caractères simples, car l'encodage de sortie pourrait aussi consister en multi octets caractères.

utiliser avec les objets DOMLSOutput et DOMLSSerializer:

DOMLSOutput* pLSOutput = impl->createLSOutput(); 

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

P.S. Veuillez noter que pour une implémentation plus efficace de writeChars() ne copiez pas et n'allouez pas toujours un nouveau buffer mais vous pouvez réserver un bloc mémoire assez grand avant ou écrire sur plusieurs blocs de mémoire ... Cette implémentation ici est juste pour montrer comment XMLFormatTarget fonctionne.