You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by aw...@hss.hns.com on 2002/10/07 10:27:37 UTC

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 "IMPI1@homedomain.com"


#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: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org