Re: Re: Validated parsing: when grammar is found, the entity resolver is
not c 2003-02-19 - By sandygao@(protected)
If you don't want to use the grammar that's in the pool, simply return null from getGrammar. The parser will then call the entity resolver and get the schema.
Or if you want to be more efficient, you can store all grammars in your grammar pool, and return the proper one when getGrammar is called (or return null if the one being asked is not in the pool).
To determine which grammar to return, you may want to (not necessary have to) use the location hint(s). There might be more than one location hints, (from xsi:schemaLocation, external-schema-location property, <import> element, etc., ) and which one to use is up to you.
Cheers, Sandy Gao Software Developer, IBM Canada (1-905) 413-3255 sandygao@(protected)
"Carla Spruit" <carla@(protected) To: <xerces-j-user@(protected) .apache.org> > cc: Subject: Re: Re: Validated parsing: when grammar is found, the entity resolver 02/19/2003 05:55 is not called AM Please respond to xerces-j-user
Hi Sandy,
Thank you for the immediate response!
I am not sure if I my question was completely clear. Maybe I can explain my problem best with the following scenario: First parse the well known 'personal-schema.xml' with attribute xsi:noNamespaceSchemaLocation='personal.xsd' with validation. Then parse another valid document with schema, say, 'test.xml' with attribute xsi:noNamespaceSchemaLocation='test.xsd' with validation.
If no grammarpool is used, everything goes fine. If a grammarpool is used, during parsing of the second document, an exception is thrown saying that the element declaration of the root element of 'test.xml' is not found. This error occurs because both documents have schema with targetnamespace = null but schema 'test.xml' is not equal to 'personal.xsd'. The second document is validated with the grammar of the first document.
To my opinion, this scenario not so very unlikely to happen. At least in our application this can be a problem as it requires the use of a grammarpool and the documents to be parsed are not known in advance. Worst of all is the confusing errormessage.
As I have my own Grammarpool implementation, I already tried to implement getGrammar. There are three things that have to be handled to make this work :
1) Grammarpool function retrieveInitialGrammarSet must always return null, otherwise getGrammar may never be called.
2) To use an entity resolver from within the getGrammar function, a system id is required. Unfortunately, the systemId of the XSDDescription parameter of getGrammar is not yet set. Instead, parameterHints can be used. Do I try each hint one by one?
3) How do I get access to the entityresolver used by the validator from within the grammarpool?
Using getGrammar to handle the case may be possible, but I personally would prefer the entity resolver to be called by the validator. I really hope that there are (or will be) easier ways to handle the case.
Thanks in advance,
Carla Spruit
----- Oorspronkelijk bericht ----- Van: <sandygao@(protected)> Aan: <xerces-j-user@(protected)> Verzonden: vrijdag 14 februari 2003 19:16 Onderwerp: Re: Validated parsing: when grammar is found, the entity resolver is not called
It's not likely that we'll change the behavior, but what you want can be achieved without such change. When the grammar is found in the grammar bucket, we have to use it, because that's loaded when the current instance document is parsed, and (by your definition) belongs to that instance. For the case where the grammar is found in the grammar pool, you can implement your own grammar pool, and return the proper grammar when getGrammar is called. (You can even call your entity resolver from within the grammar pool, if you want to.) Cheers, Sandy Gao Software Developer, IBM Canada (1-905) 413-3255 sandygao@(protected)
"Carla Spruit" <carla@(protected) To: <xerces-j-user@(protected)> > cc: Subject: Validated parsing: when grammar is found, the entity resolver is not 02/14/2003 11:58 called AM Please respond to xerces-j-user Hi, My question concerns validated parsing with an entity resolver and a grammar pool. The schema validator identifies a schema grammar by its target namespace. When the validator finds a grammar with this target namespace in the grammar bucket or in the grammar pool, the entity resolver is no longer called. I know this is not a bug and I can understand that the validator skips the entity resolver to enhance performance, however I would prefer the entity resolver to be called as it would give me more control during validated parsing. One of the reasons I would like more control is that I want to prevent the validator to use a grammar that does not belong to the document being validated, even though it has the same target namespace. Especially in cases where the target namespace is null, this is likely to happen. Is there any chance that you change this behaviour in the future? Thanks in advance! Carla Spruit
X-Hive Corporation (www.x-hive.com) email: carla@(protected) phone: +31 010 2818080 --------------------------------------------------------------------- To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) For additional commands, e-mail: xerces-j-user-help@(protected)
--------------------------------------------------------------------- To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) For additional commands, e-mail: xerces-j-user-help@(protected)
--------------------------------------------------------------------- To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) For additional commands, e-mail: xerces-j-user-help@(protected)
|
|