Hi,
Shouldn't we add a guard so that if the user calls it after parse() it
doesn't abend? Perhaps using the fParseInProgress flag?
Undefined return value is one thing, crashing is another...
Regards,
David A. Cargill
"Bob Freitas"
<[EMAIL PROTECTED]
se.com>
To
"Alberto Massari \(JIRA\)"
03/08/2005 05:29 <xerces-c-dev@xml.apache.org>
AM
cc
Subject
Please respond to RE: [jira] Resolved:
(XERCESC-1364)
xerces-c-dev Cores when using
XercesDOMParser::getSrcOffset()
Hi Alberto,
Thanks, at least I know now. Could I suggest that maybe someone should
strengthen the doc there--make it just a bit more clear.
Thanks!
-----Original Message-----
From: Alberto Massari (JIRA) [mailto:[EMAIL PROTECTED]
Sent: Tuesday, March 08, 2005 1:43 AM
To: Bob Freitas
Subject: [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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]