Details
Description
I encountered some problems using the DOMWriter:
1) Layout output XML file
When I set the 'FormatPrettyPrint' feature and set the 'NewLine' to "\r\n", I
expect to get a properly layout of XML. But the output is 'one' line with the
XML.
2) Very slow in writing
I'am trying to construct a XML structure with the DOM and write this to a file.
The constructing of the XML structure takes no more then a few seconds. The
writing to the file (LocalFileFormatTarget) takes more then 2 minutes for a
file of +/- 100k !? I tryed a workaround by using the MemBufFormatTarget and
writing the buffer to a file. This is a lot faster (takes a few seconds), but
this can't be done with UNICODE strings.
3) Can't write UNICODE (UTF-8)
I want to write the XML to a file in Unicode with UTF-8 encoding. I can open a
XML file with UTF-8 encoding correctly. But when I write it to a file it is
always ANSI and not Unicode.
I use Xerces-C++ in combination with VC++ 6.0 on a Windows 2000 machine.
code sample:
try
{ // get a serializer, an instance of DOMWriter XMLCh tempStr[100]; XMLString::transcode("LS", tempStr, 99); DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMWriter *theSerializer = ((DOMImplementationLS*)impl)- >createDOMWriter(); // set user specified end of line sequence and output encoding theSerializer->setNewLine( X("\r\n") ); // plug in user's own error handler DOMErrorHandler *myErrorHandler = new CXmlErrorHandler(); theSerializer->setErrorHandler(myErrorHandler); // set feature if the serializer supports the feature/mode bool gFormatPrettyPrint = true; if (theSerializer->canSetFeature (XMLUni::fgDOMWRTFormatPrettyPrint, gFormatPrettyPrint)) theSerializer->setFeature (XMLUni::fgDOMWRTFormatPrettyPrint, gFormatPrettyPrint); // // Plug in a format target to receive the resultant // XML stream from the serializer. // // StdOutFormatTarget prints the resultant XML stream // to stdout once it receives any thing from the serializer. // MemBufFormatTarget *myTarget = new MemBufFormatTarget(); //new LocalFileFormatTarget( strFilename ); //new StdOutFormatTarget(); // // do the serialization through DOMWriter::writeNode(); // theSerializer->writeNode(myTarget, *m_pDocument); ofstream lFile(strFilename); lFile << myTarget->getRawBuffer() << endl; delete theSerializer; // // Filter, formatTarget and error handler // are NOT owned by the serializer. // delete myTarget; bRetval = !((CXmlErrorHandler*)myErrorHandler)->getSawErrors(); delete myErrorHandler; //if (gUseFilter) // delete myFilter; }catch (XMLException& e)
{ cerr << "An error occurred during creation of output transcoder. Msg is:" << endl << StrX(e.getMessage()) << endl; bRetval = false; }