You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xerces.apache.org by Henry Miller <hm...@eti.com> on 2003/09/11 17:57:16 UTC
XMLGrammarPreparser question
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@eti.com
Evolutionary Technologies International, Inc.
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org