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=23360>. 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=23360 XMLGrammarPreparser errors when resolving external entities Summary: XMLGrammarPreparser errors when resolving external entities Product: Xerces2-J Version: 2.5.0 Platform: Sun OS/Version: Solaris Status: NEW Severity: Major Priority: Other Component: Other AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] I've search Bugzilla for all that might relate to this problem and reviewed email for related issues. None really describe the problem and only a few address a fix in CVS (but only fixes part of the problem). To that end, I'm submitting this bug report... The XMLGrammarPreparser class is not gathering external entity data for DTDs requiring it. At first I thought it was because I wasn't seting the proper features, but that doesn't seem to be the case either. it appears that the preparser is ignoring the feature settings, particularly the "load-external-dtd" feature. I have sample code and data below... I am using Xerces2-J 2.5.0 on SuSE Linux 8.2, but the exact same problem also exists using Xerces2-J 2.4.0 on Solaris (SunOS 5.7). I'm setting he features within my preparser object, but they are definitely being ignored when it runs -- I've even misspelled them purposely just to see if the code would complain. Same errors as before resulted, so essentially *nothing* happened. Now I'm convinced there's a problem. Much of my code is borrowed from the XMLGrammarBuilder.java sample program. In fact, the XMLGrammarBuilder can be used to show this problem. My test code is as follows: SymbolTable sym = new SymbolTable(BIG_PRIME); XMLGrammarPreparser preparser = new XMLGrammarPreparser(sym); XMLGrammarPoolImpl grammarPool = new XMLGrammarPoolImpl(); if(isDTD) { XMLDTDLoader grammarLoader = new XMLDTDLoader(sym, grammarPool); preparser.registerPreparser(XMLGrammarDescription.XML_DTD, grammarLoader); } else { preparser.registerPreparser(XMLGrammarDescription.XML_SCHEMA, null); } preparser.setGrammarPool(grammarPool); preparser.setProperty(GRAMMAR_POOL, grammarPool); preparser.setProperty(SYMBOL_TABLE, sym); preparser.setFeature(NAMESPACES_FEATURE_ID, true); preparser.setFeature(VALIDATION_FEATURE_ID, false); preparser.setFeature(SCHEMA_VALIDATION_FEATURE_ID, false); // Set these to see if preparser will listen to them: preparser.setFeature("http://xml.org/sax/features/external-parameter-entities", true); preparser.setFeature("http://apache.org/xml/features/continue-after-fatal-error", true); preparser.setFeature("http://apache.org/xml/nonvalidating/load-dtd-grammar", true); preparser.setFeature("http://apache.org/xml/nonvalidating/load-external-dtd", true); // parse the grammar... Grammar g = null; try { if (isDTD) { // Process DTD input file g = preparser.preparseGrammar(XMLGrammarDescription.XML_DTD, stringToXIS(inputFile) ); } else { // Process schema input file g = preparser.preparseGrammar(XMLGrammarDescription.XML_SCHEMA, stringToXIS(inputFile) ); } : ...and so on... : The failing input DTD file looks like: <?xml version='1.0' encoding='UTF-8' ?> <!ENTITY % entDec SYSTEM "EntityDecl.dtd" > %entDec; <!ELEMENT nameList (name, alias?)+> <!ELEMENT name (%flName;) > <!ELEMENT alias (%flName;) > My external entity file (EntityDecl.dtd) looks like: <?xml version='1.0' encoding='UTF-8' ?> <!ENTITY % flName " firstName, lastName " > <!ELEMENT firstName (#PCDATA) > <!ELEMENT lastName (#PCDATA) > The problem is with DTD being read in the preparser. I get the following message returned when I run the Java program: [Error] :-1:-1: http://www.w3.org/TR/1998/REC-xml-19980210#EntityNotDeclared?flName [Fatal Error] :-1:-1: http://www.w3.org/TR/1998/REC-xml-19980210#MSG_OPEN_PAREN_OR_ELEMENT_TYPE_REQUIRED_IN_CHILDREN?name Error found during parsing: http://www.w3.org/TR/1998/REC-xml-19980210#MSG_OPEN_PAREN_OR_ELEMENT_TYPE_REQUIRED_IN_CHILDREN?name Stack Trace: :::::-1:-1:http://www.w3.org/TR/1998/REC-xml-19980210#MSG_OPEN_PAREN_OR_ELEMENT_TYPE_REQUIRED_IN_CHILDREN?name at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source) at org.apache.xerces.impl.XMLDTDScannerImpl.scanChildren(Unknown Source) at org.apache.xerces.impl.XMLDTDScannerImpl.scanElementDecl(Unknown Source) at org.apache.xerces.impl.XMLDTDScannerImpl.scanDecls(Unknown Source) at org.apache.xerces.impl.XMLDTDScannerImpl.scanDTDExternalSubset(Unknown Source) at org.apache.xerces.impl.dtd.XMLDTDLoader.loadGrammar(Unknown Source) at org.apache.xerces.parsers.XMLGrammarPreparser.preparseGrammar(Unknown Source) at com.eti.rs.xml.XMLParser.main(Unknown Source) Clearly, the preparser stopped before any of my code resumes. I'm setting everything I know to set up before the preparse call. Only when I move the ENTITY declaration to within my input DTD file, does it parse and gather all the DTD info I need to process (the following DTD works against the same Java code): <?xml version='1.0' encoding='UTF-8' ?> <!ENTITY % flName " firstName, lastName " > <!ELEMENT firstName (#PCDATA) > <!ELEMENT lastName (#PCDATA) > <!ELEMENT nameList (name, alias?)+ > <!ELEMENT name (%flName;) > <!ELEMENT alias (%flName;) > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
