Hi,
If you REALLY want an efficient and fast way to create an XML document, then just use: sprintf(buffer,"<my xml tags>",parameters)!! or fprintf(fptr,"<my XML tags>,parameters) to print to a stream. Sid -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] Sent: Monday, 7 October 2002 6:28 PM To: [EMAIL PROTECTED] Subject: XML Generation efficiency Hi, My need is to generate XML on the fly and then to store it in a memory buffer. Only restriction is that I would like extremely efficient generation of XML. I followed the example CreateDOMDocument and generated a XML file. For the XML file I need took about 20 seconds for the generation process (file size 10 MB). I also used the Class XStr mentioned in the example, which the author mentions is not the most efficient way to do what is being done. A similar generation of XML file using other libraries (other than Xerces-C++) take 2 seconds. But I am not sure where I am going wrong. Could anyone suggest ways on improving the efficiency. Or could anyone suggest alternate ways for creation of XML so that the generation time can be brought down. I have used loops and hence the same variable names are used to create multiple brances of the tree. Many thanks in advance. Below is the code I used to create the XML. #include <xercesc/util/PlatformUtils.hpp> #include <xercesc/util/XMLString.hpp> #include <xercesc/dom/DOM.hpp> #include <xercesc/dom/DOMImplementation.hpp> #include <xercesc/dom/DOMImplementationLS.hpp> #include <xercesc/dom/DOMWriter.hpp> #include <xercesc/framework/StdOutFormatTarget.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/util/XMLUni.hpp> #include <iostream.h> #include <time.h> // --------------------------------------------------------------------------- // This is a simple class that lets us do easy (though not terribly efficient) // trancoding of char* data to XMLCh data. // --------------------------------------------------------------------------- class XStr { public : // ----------------------------------------------------------------------- // Constructors and Destructor // ----------------------------------------------------------------------- XStr(const char* const toTranscode) { // Call the private transcoding method fUnicodeForm = XMLString::transcode(toTranscode); } ~XStr() { delete [] fUnicodeForm; } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // Getter methods // ----------------------------------------------------------------------- const XMLCh* unicodeForm() const { return fUnicodeForm; } private : // ----------------------------------------------------------------------- // Private data members // // fUnicodeForm // This is the Unicode XMLCh format of the string. // ----------------------------------------------------------------------- XMLCh* fUnicodeForm; }; #define X(str) XStr(str).unicodeForm() #define MY_NAME_SPACE "http://my-company.com/namespace" #define XMLNS_XSI "http://www.w3.org.2003/XMLSchema-instance" #define XSI_NO_NAME_SPACE_SCHEMA_LOCATION "DDF_Schema\\3GPPdatatype.xsd" #define IMPI "[EMAIL PROTECTED]" #define MAX_NUM_SERVICE_PROFILE_PER_IMPI 20 #define MAX_NUM_IMPU_PER_SERVICE_PROFILE 20 #define MAX_NUM_IFC_PER_SERVICE_PROFILE 10 #define MAX_NUM_SPI_PER_TRIGGER_POINT 25 #define MAX_NUM_GROUP_PER_SPI 25 #define MAX_STR_EXM "it is a 256 character string. All junk data. Just to fill up space.\ it is a 256 character string. All junk data. Just to fill up space.\ it is a 256 character string. All junk data. Just to fill up space.\ it is a 256 character string. All junk data. repeat" // --------------------------------------------------------------------------- // main // --------------------------------------------------------------------------- int main(int argC, char* argV[]) { // Initialize the XML4C2 system. try { XMLPlatformUtils::Initialize(); } catch(const XMLException& toCatch) { char *pMsg = XMLString::transcode(toCatch.getMessage()); cerr << "Error during Xerces-c Initialization.\n" << " Exception message:" << pMsg; delete [] pMsg; return 1; } struct timeval timevalP; long startUSec, endUSec; long startSec, endSec, startuptimeinusec, endtimeinusec; int i,j,k,x; gettimeofday(&timevalP, NULL); startUSec = timevalP.tv_usec; startSec = timevalP.tv_sec; startuptimeinusec = startSec * 1000000 + startUSec; cout << "Start Sec:" << startSec << endl; cout << "Start uSec:" << startUSec << endl; cout << "startuptimeinusec:" << startuptimeinusec << endl; DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core")); DOMDocument* doc = impl->createDocument( 0, // root element namespace URI. X("testdocument"), // root element name 0); // document type object (DTD). doc->setEncoding(X("UTF-8")); doc->setVersion(X("1.0")); DOMElement* rootElem = doc->getDocumentElement(); /* IMS Subscription */ DOMElement* IMSElem = doc->createElement(X("IMSSubscription")); rootElem->appendChild(IMSElem); /* PrivateID */ DOMElement* PriIDElem = doc->createElement(X("PrivateID")); IMSElem->appendChild(PriIDElem ); PriIDElem->setAttribute(X("index"),X("0")); DOMText* PriIDdataval = doc->createTextNode(X(MAX_STR_EXM)); PriIDElem->appendChild(PriIDdataval ); /* ServiceProfile 1..20 */ for (i=0; i<MAX_NUM_SERVICE_PROFILE_PER_IMPI ; i++){ DOMElement* ServProElem = doc->createElement(X("ServiceProfile")); IMSElem->appendChild(ServProElem); ServProElem->setAttribute(X("index"),X("0")); /*Public Identity */ DOMElement* PubIDElem = doc->createElement(X("PublicIdentity")); ServProElem->appendChild(PubIDElem); PubIDElem->setAttribute(X("index"),X("0")); /* Identity */ DOMElement* IDElem = doc->createElement(X("Identity")); PubIDElem->appendChild(IDElem); IDElem->setAttribute(X("index"),X("0")); DOMText* IDDataval = doc->createTextNode(X(MAX_STR_EXM)); IDElem->appendChild(IDDataval); /* Barring Indication */ DOMElement* BarrIndElem = doc->createElement(X("BarringIndication")); PubIDElem->appendChild(BarrIndElem); BarrIndElem->setAttribute(X("index"),X("0")); DOMText* BarrIndDataval = doc->createTextNode(X(MAX_STR_EXM)); BarrIndElem->appendChild(BarrIndDataval ); /* Initial filter Criteria 1..10 ---------------------------------------------------*/ for (x=0; x<MAX_NUM_IFC_PER_SERVICE_PROFILE; x++){ DOMElement* IFCElem = doc->createElement(X("InitialFilterCriteria")); ServProElem->appendChild(IFCElem ); /* Priority */ DOMElement* PrioElem = doc->createElement(X("Priority")); IFCElem->appendChild(PrioElem ); PrioElem->setAttribute(X("index"),X("0")); DOMText* PrioDataval = doc->createTextNode(X("0")); PrioElem->appendChild(PrioDataval); /* Trigger Point */ DOMElement* TrigPntElem = doc->createElement(X("TriggerPoint")); IFCElem->appendChild(TrigPntElem ); TrigPntElem->setAttribute(X("index"),X("0")); /* ConditionTypeCNF*/ DOMElement* CondTCNFElem = doc->createElement(X("ConditionTypeCNF")); TrigPntElem->appendChild(CondTCNFElem ); CondTCNFElem->setAttribute(X("index"),X("0")); DOMText* CondTCNFDataval = doc->createTextNode(X("0")); CondTCNFElem->appendChild(CondTCNFDataval ); /* SPI -----------------*/ for (j=0; j<MAX_NUM_SPI_PER_TRIGGER_POINT; j++){ DOMElement* SPIElem = doc->createElement(X("SPI")); TrigPntElem->appendChild(SPIElem ); SPIElem->setAttribute(X("index"),X("0")); /* Condition Negated */ DOMElement* CondNegElem= doc->createElement(X("ConditionNegated")); SPIElem->appendChild(CondNegElem); CondNegElem->setAttribute(X("index"),X("0")); DOMText* CondNegDataval = doc->createTextNode(X("0")); CondNegElem->appendChild(CondNegDataval ); /* Group -------*/ for (k=0; k<MAX_NUM_GROUP_PER_SPI; k++){ DOMElement* GroupElem= doc->createElement(X("Group")); SPIElem->appendChild(GroupElem); GroupElem->setAttribute(X("index"),X("0")); DOMText* GroupDataval = doc->createTextNode(X("0")); GroupElem->appendChild(GroupDataval); } // Group iterations end here /* Method */ DOMElement* MethodElem= doc->createElement(X("Method")); SPIElem->appendChild(MethodElem); MethodElem->setAttribute(X("index"),X("0")); DOMText* MethodDataval = doc->createTextNode(X(MAX_STR_EXM)); MethodElem->appendChild(MethodDataval); /* SIP Header*/ DOMElement* SIPHeadElem= doc->createElement(X("SIPHeader")); SPIElem->appendChild(SIPHeadElem); SIPHeadElem->setAttribute(X("index"),X("0")); /* Header*/ DOMElement* HeadElem= doc->createElement(X("Header")); SIPHeadElem->appendChild(HeadElem); HeadElem->setAttribute(X("index"),X("0")); DOMText* HeadDataval = doc->createTextNode(X(MAX_STR_EXM)); HeadElem->appendChild(HeadDataval); /* Content */ DOMElement* ContentElem= doc->createElement(X("Content")); SIPHeadElem->appendChild(ContentElem); ContentElem->setAttribute(X("index"),X("0")); DOMText* ContentDataval = doc->createTextNode(X(MAX_STR_EXM)); ContentElem->appendChild(ContentDataval); /* Session Case*/ DOMElement* SessionCaseElem= doc->createElement(X("SessionCase")); SPIElem->appendChild(SessionCaseElem); SessionCaseElem->setAttribute(X("index"),X("0")); DOMText* SessionCaseDataval = doc->createTextNode(X("0")); SessionCaseElem->appendChild(SessionCaseDataval); /* Session Description*/ DOMElement* SessDescElem= doc->createElement(X("SesssionDescription")); SPIElem->appendChild(SessDescElem); SessDescElem->setAttribute(X("index"),X("0")); /* Line */ DOMElement* LineElem= doc->createElement(X("Line")); SessDescElem->appendChild(LineElem); LineElem->setAttribute(X("index"),X("0")); DOMText* LineDataval = doc->createTextNode(X(MAX_STR_EXM)); LineElem->appendChild(LineDataval); /* Content */ DOMElement* SDContentElem= doc->createElement(X("Content")); SessDescElem->appendChild(SDContentElem); SDContentElem->setAttribute(X("index"),X("0")); DOMText* SDContentDataval = doc->createTextNode(X(MAX_STR_EXM)); SDContentElem->appendChild(SDContentDataval); }//SPI iterations end here /* Application Server */ DOMElement* AppServerElem= doc->createElement(X("ApplicationServer")); IFCElem->appendChild(AppServerElem); AppServerElem->setAttribute(X("index"),X("0")); /*Server Name */ DOMElement* ServerNameElem= doc->createElement(X("ServerName")); AppServerElem->appendChild(ServerNameElem); ServerNameElem->setAttribute(X("index"),X("0")); DOMText* ServerNameDataval = doc->createTextNode(X(MAX_STR_EXM)); ServerNameElem->appendChild(ServerNameDataval); /* Default Handling*/ DOMElement* DefaultHElem = doc->createElement(X("DefaultHandling")); AppServerElem->appendChild(DefaultHElem ); DefaultHElem->setAttribute(X("index"),X("0")); DOMText* DefaultHDataval = doc->createTextNode(X("0")); DefaultHElem->appendChild(DefaultHDataval); /*Service Info */ DOMElement* ServiceInfoElem = doc->createElement(X("ServiceInfo")); AppServerElem->appendChild(ServiceInfoElem ); ServiceInfoElem->setAttribute(X("index"),X("0")); DOMText* ServiceInfoDataval = doc->createTextNode(X(MAX_STR_EXM)); ServiceInfoElem->appendChild(ServiceInfoDataval); }//IFC iterations end here } //Service Profile Iteration ends here /* Serialize */ // get a serializer, an instance of DOMWriter XMLCh tempStr[100]; XMLString::transcode("LS", tempStr, 99); DOMImplementation *implw = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMWriter *theSerializer = ((DOMImplementationLS*)implw)->createDOMWriter(); XMLFormatTarget *myFormTarget = new StdOutFormatTarget(); // do the serialization through DOMWriter::writeNode(); // theSerializer->writeNode(myFormTarget, *doc); delete theSerializer; doc->release(); XMLPlatformUtils::Terminate(); gettimeofday(&timevalP, NULL); endSec = timevalP.tv_sec; endUSec = timevalP.tv_usec; endtimeinusec = endSec * 1000000 + endUSec; cout << "\nEnd Sec:"<< endSec << endl; cout << "End uSec:" << endUSec << endl; cout << " endtimeinusec:" << endtimeinusec << endl; cout << "\nTime Taken:secs "<< endSec-startSec << endl; cout << "Time Taken:microsecs "<< endUSec-startUSec << endl; cout << "Diff of start & end Time:microsecs "<< endtimeinusec - startuptimeinusec << endl; return 0; } DISCLAIMER: This message is proprietary to Hughes Software Systems Limited (HSS) and is intended solely for the use of the individual to whom it is addressed. It may contain privileged or confidential information and should not be circulated or used for any purpose other than for what it is intended. If you have received this message in error, please notify the originator immediately. If you are not the intended recipient, you are notified that you are strictly prohibited from using, copying, altering, or disclosing the contents of this message. HSS accepts no responsibility for loss or damage arising from the use of the information transmitted by this email including damage from virus. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
