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