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 "Alberto Massari (JIRA)" <xe...@xml.apache.org> on 2005/03/08 10:42:53 UTC

[jira] Resolved: (XERCESC-1364) Cores when using XercesDOMParser::getSrcOffset()

     [ http://issues.apache.org/jira/browse/XERCESC-1364?page=history ]
     
Alberto Massari resolved XERCESC-1364:
--------------------------------------

    Resolution: Invalid

Bob, 
the getSrcOffset API returns the offset in the source stream during the parse phase; invoking it after parse() returns produces an undefined behaviour.

Alberto

> Cores when using XercesDOMParser::getSrcOffset()
> ------------------------------------------------
>
>          Key: XERCESC-1364
>          URL: http://issues.apache.org/jira/browse/XERCESC-1364
>      Project: Xerces-C++
>         Type: Bug
>   Components: DOM
>     Versions: 2.6.0
>  Environment: Solaris 2.8, Ultra 5, gcc 3.3.2
>     Reporter: Bob Freitas

>
> I want to do some additional checking on the info in the XML document, so naturally I am going to need to communicate to the end-user.  I was planning on using the getSrcOffset() method to get an idea of where I was parsing in the XML.    Unfortunately, the getSrcOffset() just cores when I try to use it.  Here is more or less what I am doing in my code.  I had to cut and paste from a bunch of different objects to get it in one place.  I tried to include everything pertinent:
> // in the header file
> xercesc::XercesDOMParser* parser;
> xercesc::DOMDocument* doc;
> DOMParseErrorHandler* saxErrorHandler; // home grown object 
> typedef vector<xercesc::DOMNode*> ElementCollection;
> // basic flow of program, only in mine spread over multiple objects
> parser = new xercesc::XercesDOMParser();
> saxErrorHandler = new DOMParseErrorHandler();
> parser->setErrorHandler(saxErrorHandler);
> parser->setCalculateSrcOfs(true);
> ... do a bunch of my own stuff
> const char* fileName; // gets received as a parameter
>   
> try
> {
>   parser->parse( fileName );
> }
> catch (const xercesc::XMLException& e)
> {
>   ... do a whole bunch of catches and stuff here
> }
>   
> doc = parser->getDocument();
> xercesc::DOMElement* root = doc->getDocumentElement();
> ElementCollection eleColl;
> if ( !getChildren(doc, root, &eleColl) )
> {
>   return DOM_TREE_NO_READ; // defined in a separate enum
> }
>   
> ElementCollection::iterator nodeIter;
> ElementCollection::iterator nodeIterEnd = eleColl.end();
> for(nodeIter = eleColl.begin(); nodeIter != nodeIterEnd; ++nodeIter)
> {
>   xercesc::DOMNode* node = *nodeIter;
>   xercesc::DOMElement* ele = (xercesc::DOMElement*)node;
>   const XMLCh* nodeName = ele->getNodeName();
>     
>   ... look for my XML tags of interest and process them
>     
>   unsigned int offset = parser->getSrcOffset();
>   // cores on the above statement, see below for gdb trace 
>   
>     
> }
>   
> bool getChildren(xercesc::DOMDocument* doc,
> xercesc::DOMElement* parent, ElementCollection* eleColl)
> {
>   if ( doc == NULL )
>   {
>     Log(ERROR, ("Unable to read DOM tree, doc is empty");
>     return false;
>   }
>   if ( parent == NULL )
>   {
>     Log(ERROR, (char*)"Unable to read DOM tree, parent element is empty");
>     return false;
>   }
>   assert( eleColl != NULL );
>   
>   xercesc::DOMTreeWalker* walker = doc->createTreeWalker(parent, 
>     xercesc::DOMNodeFilter::SHOW_ELEMENT, NULL, true);
>   if ( walker == NULL )
>   {
>     Log(ERROR, (char*)"Unable to read DOM tree, error creating tree walker");
>     return false;
>   }
>   xercesc::DOMNode* node;
>   if ( ( node=walker->firstChild() ) != NULL )
>   {
>     while ( node != NULL )
>     {
>       eleColl->push_back(node);
>       node = walker->nextSibling();
>     }
>   }
>   if ( walker != NULL )
>   {
>     walker->release();
>   }
>   return true;
> }
> ------------------------------------
> gdb trace after core:
> (gdb) bt 10
> #0  xercesc_2_6::XMLString::replicate(char const*, xercesc_2_6::MemoryManager*)
>     (toRep=0xfef44320 "XMLReader.cpp", manager=0x82100008) at XMLString.cpp:511
> #1  0xfee0dabc in xercesc_2_6::XMLException::XMLException(char const*, unsigned, xercesc_2_6::MemoryManager*) (this=0x6f8d0, 
>     srcFile=0xfef44320 "XMLReader.cpp", srcLine=400, memoryManager=0x82100008)
>     at XMLException.cpp:146
> #2  0xfee14288 in xercesc_2_6::XMLReader::getSrcOffset() const (this=0x6f8d0)
>     at /tmp/xerces-c-src_2_6_0/include/xercesc/util/RuntimeException.hpp:30
> Current language:  auto; currently c++
> (gdb) quit

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org