Please. I need an answer from somemone who knows better than I, here goes:
Without setting anything special in the XMLGrammarPreparser, shouldn't the Xerces parse process automatically resolve external entities?
I mean, if I were validating an XML instance document using a DTD that contains externally defined parameter entities, doesn't the parser automatically resolve the external entities there in order to validate the document?
So why can't I get the preparser to resolve the same entities, if I just want to cache the grammar from the same DTD in the example above? The (pre)parser itself keeps giving me an error of "EntityNotDeclared" for the only external entity defined in my test.
Has anyone run into this situation?
What am I not telling the XMLGrammarPreparser? I am not setting any features or properties (actually I tried setting relevant features, but they seem to be ignored by the parser).
Can someone help me? Any pointers?? I'm running with Xerces-J 2.5.0.
As a footnote to the original question I've posted, here's some additional info to my problem:
I'm setting 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. Should I report a bug in the preparser?
My test code is as follows (much of it borrowed from the XMLGrammarBuilder.java sample program) :
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) );
}
The problem is with DTDs being read. I get in return the message:
[Error] :-1:-1: http://www.w3.org/TR/1998/REC-xml-19980210#EntityNotDeclared?CONTACT
[Fatal Error] :-1:-1: http://www.w3.org/TR/1998/REC-xml-19980210#MSG_OPEN_PAREN_OR_ELEMENT_TYPE_REQUIRED_IN_CHILDREN?Address
Error found during parsing: http://www.w3.org/TR/1998/REC-xml-19980210#MSG_OPEN_PAREN_OR_ELEMENT_TYPE_REQUIRED_IN_CHILDREN?Address
Stack Trace:
:::::-1:-1:http://www.w3.org/TR/1998/REC-xml-19980210#MSG_OPEN_PAREN_OR_ELEMENT_TYPE_REQUIRED_IN_CHILDREN?Address
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 starts. So what did I forget to tell the preparser? Or is this really a bug?
Any reply is more than I had before. Thanks for reading this far! --
--Henry Miller
[EMAIL PROTECTED] Evolutionary Technologies International, Inc.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
