Hi,
I recall some discussion a while back about having lots of
userdata being very slow. Take out that line and reparse and if that is
the case then I will wrack my brain (or we could always look in the
archives). I recall a proposed solution to this as well. What version are
you using?
Gareth
On Thu, 4 Sep 2003, Agrawal, Vikas (ELS) wrote:
> Hi All,
>
> I am using DOMBuilder as a parser to parse my 10 MB file and it is terribly
> horribly slow. Could anybody suggest me how to improve perfomance. James
> clark SP parser was used to take not more than a 30 seconds to parse this
> file. DOMBuilder is taking around 20 minutes to parse my file if I override
> the startElement function as follows.
>
> Normally DOMBuilder is also efficient and taking just 30 seconds if I do not
> override the startElement function. I am wondering why is it adding another
> 19 and half minutes in parsing time if I just override the startElement and
> that is just to put node location information in the node user data.
>
> Am I doing something wrong in the overridden startElement function below.
>
> class EsDOMBuilderImpl : public DOMBuilderImpl
>
> void EsDOMBuilderImpl::startElement
> (
> const XMLElementDecl& elemDecl
> , const unsigned int urlId
> , const XMLCh* const elemPrefix
> , const RefVectorOf<XMLAttr>& attrList
> , const unsigned int attrCount
> , const bool isEmpty
> , const bool isRoot
> )
> {
> const XMLCh* const systemId = 0;
>
> AbstractDOMParser::startElement(elemDecl,urlId,elemPrefix,attrList,attrCount
> ,isEmpty,isRoot);
> XMLScanner* sc = this->getScanner();
> const Locator* loc = sc->getLocator();
>
> int lineNum = loc->getLineNumber();
> int colNum = loc->getColumnNumber();
> int offset = sc->getSrcOffset();
> DOMNode* node = this->getCurrentNode();
> DOMLocator* location = new DOMLocatorImpl(lineNum, colNum,
> getCurrentNode(), systemId);
> location->setOffset(offset);
>
> node->setUserData(locXmlStr_,location,0);
>
> DOMLocator* vlocator = (DOMLocator*)node->getUserData(locXmlStr_);
> return;
> }
>
> In the following way I am creating the parser
> DOMBuilder* XmlDocumentTree::parserInstance()
> {
> if(parserInstance_ == NULL)
> {
> static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull };
>
> DOMImplementationRegistry::addSource((DOMImplementationSource*)EsDOMImplemen
> tationImpl::getDOMImplementationImpl());
> DOMImplementation *impl =
> DOMImplementationRegistry::getDOMImplementation(gLS);
>
> parserInstance_ =
> ((DOMImplementationLS*)impl)->createDOMBuilder(DOMImplementationLS::MODE_SYN
> CHRONOUS, 0); // it returns EsDOMBuilderImpl class pointer.
> delete impl;
> parserInstance_->setFeature(XMLUni::fgDOMValidation, true);
> parserInstance_->setFeature(XMLUni::fgDOMNamespaces, false);
> //parserInstance_->setFeature(X("namespaces"), true);
>
>
> parserInstance_->setFeature(XMLUni::fgDOMEntities, false);
> parserInstance_->setFeature(XMLUni::fgXercesCalculateSrcOfs,
> true);
>
> ((EsDOMBuilderImpl*)parserInstance_)->setIncludeIgnorableWhitespace(false);
> }
> return parserInstance_;
> }
>
> I use it in the following way
>
> XMLPlatformUtils::Initialize();
> app->init();
> parser = parserInstance();
>
> errHandler_ = new EsDOMErrorHandler(warn);
> parserInstance_->setErrorHandler(errHandler_);
>
> entHandler_ = new EsXml4cDomEntityResolver();
> entHandler_->addDirToPath(env);
> parserInstance_->setEntityResolver(entHandler_);
> DOMDocument * doc = 0;
> doc = parser->parseURI(fname.c_str());
> node = doc->getDocumentElement();
>
> Thanks & Regards
> Vikas Agrawal
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
--
Gareth Reakes, Head of Product Development +44-1865-203192
DecisionSoft Limited http://www.decisionsoft.com
XML Development and Services
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]