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 bu...@apache.org on 2004/01/21 17:48:06 UTC

DO NOT REPLY [Bug 26315] New: - Caching DTD; duplicate root element when parsing DOCTYPE

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=26315>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=26315

Caching DTD; duplicate root element when parsing DOCTYPE

           Summary: Caching DTD; duplicate root element when parsing DOCTYPE
           Product: Xerces-C++
           Version: 2.4.0
          Platform: Other
        OS/Version: Linux
            Status: NEW
          Severity: Major
          Priority: Other
         Component: Validating Parser (DTD)
        AssignedTo: xerces-c-dev@xml.apache.org
        ReportedBy: jonathan.bosloy@solacesystems.com


After caching of an external DTD, when parsing XML files that refer to the 
external (cached) DTD, the first file is processed OK, but the second file 
complains about a duplicate element when parsing the DOCTYPE declaration.

Also tried the Jan 20, 2004 nightly build, with the same results.

This works fine with cached schemas, and seems to only be a problem with 
cached DTD.

To test grammar caching, I modifed samples/DOMCount/DOMCount.cpp and added the 
following two lines:

  parser->setFeature(XMLUni::fgXercesCacheGrammerFromParse, true);
  parser->setFeature(XMLUni::fgXercesUseCacheGrammerInParse, true);

I invoked DOMCount as follows:
  DOMCount -n -s -f -l filelist

filelist contains the same XML file twice, i.e:
  0-OrderRequest.xml
  0-OrderRequest.xml

The first file is parsed successfully.  The second file has the following 
error:

  Fatal Error at file 0-OrderRequest.xml, line 6, char 15
  Message: An exception occurred! Type:IllegalArgumentException, Message:The 
element cXML already exists

line 6 of the file contains:
<!DOCTYPE cXML SYSTEM "/home/jbosloy/example/cXML/cXML.dtd">

The parse is failing in IGXMLScanner::scanDocTypeDecl():

    if(!fUseCachedGrammar) 
    {
       ...
    } else
    {
        // attach this to the undeclared element pool so that it gets deleted
        rootDecl->setId(fDTDElemNonDeclPool->put((DTDElementDecl*)rootDecl));
    }

The only spot that I can find where fDTDElemNonDeclPool is ever emptied is in 
IGXMLScanner::loadDTDGrammer.  So, the first time a document is parsed, the 
root element is put into the pool, and when the document is parsed a second 
time, the root element is put into the pool again and fails since it already 
exists.

Is the fDTDElemNonDeclPool not supposed to have its contents removed after the 
handling of a document is complete?

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