2010-12-08 13 views
3

私はxerces-cで解析されたXML文書を持っており、DOMPrintの例のようなファイルに正常に書き込むことができますが、これを配列に格納することはできません。私はまだシリアライザを使うべきだとオンラインで見ていますが、私は何を変えるべきか分かりません。明らかに、LocalFileFormatTargetを使用する代わりに、私は別のものを使うべきですが、MemBufFormatTargetのリファレンスをオンラインで見れば、それを使う方法が分かりません。 xerces-cを使用してxmlドキュメントを文字列に変換するにはどうすればよいですか?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のしくみ