XMLGrammarPreparser question 2003-09-11 - By Henry Miller
I posted this question to xerces-j-dev, but got no response so I'll try here. Sorry if you've seen it before...
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
hmiller@(protected) Evolutionary Technologies International, Inc.
--------------------------------------------------------------------- To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) For additional commands, e-mail: xerces-j-user-help@(protected)
|
|