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 Simon Raess <co...@gmx.ch> on 2006/09/25 22:22:43 UTC
Dynamic Lookup of Schema Documents
Hi
I'm developing an XML format that is extensible. The format serves as
a kind of container with well-defined extension points. The following
example shows a document that is similar to the format I'm using:
<container xmlns="urn:container">
<binding name="x"/>
<access xmlns="urn:xpath">...</access>
</container>
I want to validate the above XML against the corresponding schemas.
However, I don't want to specify the schema locations inside the
document (I don't trust the creators of the document). I'd like to
look up the schemas at runtime based on the namespace attribute.
Unfortunately, I haven't been able to figure out how to tell Xerces
which schema to use to validate the document.
I know, I could specify all the schema locations programatically. But
I don't want to do that. I'd rather have Xerces ask me on demand how
to resolve the namespace to a schema document (kind of like an
EntityResolver but based on the namespace).
Is this approach possible with Xerces? If yes, how?
Thanks
Simon
---------------------------------------------------------------------
To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-users-help@xerces.apache.org
Re: Dynamic Lookup of Schema Documents
Posted by Dick Deneer <di...@donkeydevelopment.com>.
Yes, I think your right, it only gets triggerred whne there is a
schemaLocation attribute; and that is not want you (and me either) want.
Dick
Op 26-sep-2006, om 6:08 heeft Simon Raess het volgende geschreven:
> Hi
>
> I've tried to use it, but the LSResourceResolver was never called:
>
> public class SchemaTest {
> public static void main(String[] args) throws Exception {
> SchemaFactory factory = SchemaFactory.newInstance
> (XMLConstants.W3C_XML_SCHEMA_NS_URI);
> Schema schema = factory.newSchema();
> Validator validator = schema.newValidator();
> validator.setResourceResolver(new Resolver());
> validator.validate(new StreamSource(new File(args[0])));
> }
>
> private static class Resolver implements LSResourceResolver {
> public LSInput resolveResource(
> java.lang.String type, java.lang.String namespaceURI,
> java.lang.String publicId, java.lang.String systemId,
> java.lang.String baseURI) {
> System.out.println(type + " / " + namespaceURI + " / " +
> publicId + " / " + systemId + " / " + baseURI);
> return null;
> }
> }
> }
>
> I haven't used the Validator stuff before. Do I have to configure
> something more? My test xml looks like:
>
> <root xmlns="http://example.com/root">
> <child>test</child>
> </root>
>
> And the test program fails with the following exception:
>
> Exception in thread "main" org.xml.sax.SAXParseException: cvc-elt.
> 1: Cannot find the declaration of element 'root'.
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.Util.toSAXParseExce
> ption(Util.java:109)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ErrorHandlerAdaptor
> .error(ErrorHandlerAdaptor.java:104)
> at
> com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
> (XMLErrorReporter.java:382)
> at
> com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
> (XMLErrorReporter.java:316)
> at
> com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleSt
> artElement(XMLSchemaValidator.java:1944)
> at
> com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startEle
> ment(XMLSchemaValidator.java:705)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImp
> l.startElement(ValidatorHandlerImpl.java:335)
> at
> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElem
> ent(AbstractSAXParser.java:533)
> at
> com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanS
> tartElement(XMLNSDocumentScannerImpl.java:330)
> at
> com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl
> $NSContentDispatcher.scanRootElementHook
> (XMLNSDocumentScannerImpl.java:779)
> at
> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl
> $FragmentContentDispatcher.dispatch
> (XMLDocumentFragmentScannerImpl.java:1794)
> at
> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl
> .scanDocument(XMLDocumentFragmentScannerImpl.java:368)
> at
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
> (XML11Configuration.java:834)
> at
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
> (XML11Configuration.java:764)
> at
> com.sun.org.apache.xerces.internal.parsers.XMLParser.parse
> (XMLParser.java:148)
> at
> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse
> (AbstractSAXParser.java:1242)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.proce
> ss(ValidatorImpl.java:192)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.valid
> ate(ValidatorImpl.java:159)
> at javax.xml.validation.Validator.validate(Validator.java:82)
> at SchemaTest.main(SchemaTest.java:14)
>
> Simon
>
>
>
> On 25.09.2006, at 23:06, Dick Deneer wrote:
>
>> Can't you use the LSResourceResolver in combination with the JAXP
>> Validator.
>>
>> Dick Deneer
>> Op 25-sep-2006, om 22:22 heeft Simon Raess het volgende geschreven:
>>
>>> Hi
>>>
>>> I'm developing an XML format that is extensible. The format
>>> serves as a kind of container with well-defined extension points.
>>> The following example shows a document that is similar to the
>>> format I'm using:
>>>
>>> <container xmlns="urn:container">
>>> <binding name="x"/>
>>> <access xmlns="urn:xpath">...</access>
>>> </container>
>>>
>>> I want to validate the above XML against the corresponding
>>> schemas. However, I don't want to specify the schema locations
>>> inside the document (I don't trust the creators of the document).
>>> I'd like to look up the schemas at runtime based on the namespace
>>> attribute. Unfortunately, I haven't been able to figure out how
>>> to tell Xerces which schema to use to validate the document.
>>>
>>> I know, I could specify all the schema locations programatically.
>>> But I don't want to do that. I'd rather have Xerces ask me on
>>> demand how to resolve the namespace to a schema document (kind of
>>> like an EntityResolver but based on the namespace).
>>>
>>> Is this approach possible with Xerces? If yes, how?
>>>
>>> Thanks
>>> Simon
>>>
>>> --------------------------------------------------------------------
>>> -
>>> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
>>> For additional commands, e-mail: j-users-help@xerces.apache.org
>>>
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
>> For additional commands, e-mail: j-users-help@xerces.apache.org
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
> For additional commands, e-mail: j-users-help@xerces.apache.org
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-users-help@xerces.apache.org
Re: Dynamic Lookup of Schema Documents
Posted by Simon Raess <co...@gmx.ch>.
Hi Michael
Thanks a lot. I was not using Xerces. Your assumption was correct. I
was using the parser included with Sun's Java 5. I downloaded Xerces
2.8.1, added it to the classpath, set the
javax.xml.validation.SchemaFactory property to the correct value, and
everything worked just fine (they way you expected).
Simon
On 26.09.2006, at 15:48, Michael Glavassevich wrote:
> Hi Simon,
>
> You weren't actually using Xerces when you ran your test. The
> com.sun.org.apache.xerces.internal.* packages originate from Sun's
> Java 5.
> Regardless of whether there are schema locations in the document or
> not it
> doesn't seem to call the LSResourceResolver. This is probably one
> of many
> bugs which we've fixed (in the last three years) or one that never
> existed
> since the Validator implementation in Xerces is significantly
> different
> than the one included in Java 5.
>
> There's one Java 5 bug [1] in particular which prevents the
> SchemaFactory's factory finder from finding the implementation on the
> classpath. If you had xercesImpl.jar in your classpath this would
> explain
> why you got the JDK default instead. To select Xerces'
> SchemaFactory you
> can set a system property -Djavax.xml.validation.SchemaFactory:
> http://www.w3.org/2001/
> XMLSchema=org.apache.xerces.jaxp.validation.XMLSchemaFactory
> . Putting the xml-apis.jar which accompanies Xerces in your JDK's
> endorsed
> directory [2] works as well.
>
> Once you get it working the output from your test (with the print
> out from
> your LSResourceResolver) should look something like:
>
> http://www.w3.org/2001/XMLSchema / http://example.com/root / null /
> null /
> file:///C:/xmldocs/test.xml
> org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the
> declaration of
> element 'root'.
> at
> org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException
> (ErrorHandlerWrapper.java:196)
> at
> org.apache.xerces.util.ErrorHandlerWrapper.error
> (ErrorHandlerWrapper.java:132)
> at
> org.apache.xerces.impl.XMLErrorReporter.reportError
> (XMLErrorReporter.java:347)
> at
> org.apache.xerces.impl.XMLErrorReporter.reportError
> (XMLErrorReporter.java:281)
> at
> org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement
> (XMLSchemaValidator.java:2011)
> at
> org.apache.xerces.impl.xs.XMLSchemaValidator.startElement
> (XMLSchemaValidator.java:725)
> at
> org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement
> (XMLNSDocumentScannerImpl.java:283)
> at
> org.apache.xerces.impl.XMLNSDocumentScannerImpl
> $NSContentDispatcher.scanRootElementHook
> (XMLNSDocumentScannerImpl.java:736)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl
> $FragmentContentDispatcher.dispatch
> (XMLDocumentFragmentScannerImpl.java:1755)
> at
> org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument
> (XMLDocumentFragmentScannerImpl.java:324)
> at
> org.apache.xerces.parsers.XML11Configuration.parse
> (XML11Configuration.java:845)
> at
> org.apache.xerces.parsers.XML11Configuration.parse
> (XML11Configuration.java:768)
> at
> org.apache.xerces.jaxp.validation.StreamValidatorHelper.validate
> (StreamValidatorHelper.java:121)
> at
> org.apache.xerces.jaxp.validation.ValidatorImpl.validate
> (ValidatorImpl.java:110)
> at javax.xml.validation.Validator.validate(Unknown Source)
> at SchemaTest.main(SchemaTest.java:20)
>
> Thanks.
>
> [1] http://marc.theaimsgroup.com/?l=xml-commons-
> dev&m=111898640501739&w=2
> [2] http://xerces.apache.org/xerces2-j/faq-general.html#faq-4
>
> Michael Glavassevich
> XML Parser Development
> IBM Toronto Lab
> E-mail: mrglavas@ca.ibm.com
> E-mail: mrglavas@apache.org
>
> Simon Raess <co...@gmx.ch> wrote on 09/26/2006 12:08:38 AM:
>
>> Hi
>>
>> I've tried to use it, but the LSResourceResolver was never called:
>>
>> public class SchemaTest {
>> public static void main(String[] args) throws Exception {
>> SchemaFactory factory = SchemaFactory.newInstance
>> (XMLConstants.W3C_XML_SCHEMA_NS_URI);
>> Schema schema = factory.newSchema();
>> Validator validator = schema.newValidator();
>> validator.setResourceResolver(new Resolver());
>> validator.validate(new StreamSource(new File(args[0])));
>> }
>>
>> private static class Resolver implements LSResourceResolver {
>> public LSInput resolveResource(
>> java.lang.String type, java.lang.String namespaceURI,
>> java.lang.String publicId, java.lang.String systemId,
>> java.lang.String baseURI) {
>> System.out.println(type + " / " + namespaceURI + " / " +
>> publicId + " / " + systemId + " / " + baseURI);
>> return null;
>> }
>> }
>> }
>>
>> I haven't used the Validator stuff before. Do I have to configure
>> something more? My test xml looks like:
>>
>> <root xmlns="http://example.com/root">
>> <child>test</child>
>> </root>
>>
>> And the test program fails with the following exception:
>>
>> Exception in thread "main" org.xml.sax.SAXParseException: cvc-elt.1:
>> Cannot find the declaration of element 'root'.
>> at
>> com.sun.org.apache.xerces.internal.jaxp.validation.Util.toSAXParseExc
>> ept
>
>> ion(Util.java:109)
>> at
>> com.sun.org.apache.xerces.internal.jaxp.validation.ErrorHandlerAdapto
>> r.e
>
>> rror(ErrorHandlerAdaptor.java:104)
>> at
>> com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
>> (XMLErrorReporter.java:382)
>> at
>> com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
>> (XMLErrorReporter.java:316)
>> at
>> com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleS
>> tar
>
>> tElement(XMLSchemaValidator.java:1944)
>> at
>> com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startEl
>> eme
>
>> nt(XMLSchemaValidator.java:705)
>> at
>> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerIm
>> pl.
>
>> startElement(ValidatorHandlerImpl.java:335)
>> at
>> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startEle
>> men
>
>> t(AbstractSAXParser.java:533)
>> at
>> com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scan
>> Sta
>
>> rtElement(XMLNSDocumentScannerImpl.java:330)
>> at
>> com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl
>> $NSContentDispatcher.scanRootElementHook
>> (XMLNSDocumentScannerImpl.java:779)
>> at
>> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
>> l
>> $FragmentContentDispatcher.dispatch
>> (XMLDocumentFragmentScannerImpl.java:1794)
>> at
>> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
>> l.s
>
>> canDocument(XMLDocumentFragmentScannerImpl.java:368)
>> at
>> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
>> (XML11Configuration.java:834)
>> at
>> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
>> (XML11Configuration.java:764)
>> at
>> com.sun.org.apache.xerces.internal.parsers.XMLParser.parse
>> (XMLParser.java:148)
>> at
>> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse
>> (AbstractSAXParser.java:1242)
>> at
>> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.proc
>> ess
>
>> (ValidatorImpl.java:192)
>> at
>> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.vali
>> dat
>
>> e(ValidatorImpl.java:159)
>> at javax.xml.validation.Validator.validate(Validator.java:
>> 82)
>> at SchemaTest.main(SchemaTest.java:14)
>>
>> Simon
>>
>>
>>
>> On 25.09.2006, at 23:06, Dick Deneer wrote:
>>
>>> Can't you use the LSResourceResolver in combination with the JAXP
>>> Validator.
>>>
>>> Dick Deneer
>>> Op 25-sep-2006, om 22:22 heeft Simon Raess het volgende geschreven:
>>>
>>>> Hi
>>>>
>>>> I'm developing an XML format that is extensible. The format serves
>>>> as a kind of container with well-defined extension points. The
>>>> following example shows a document that is similar to the format
>>>> I'm using:
>>>>
>>>> <container xmlns="urn:container">
>>>> <binding name="x"/>
>>>> <access xmlns="urn:xpath">...</access>
>>>> </container>
>>>>
>>>> I want to validate the above XML against the corresponding
>>>> schemas. However, I don't want to specify the schema locations
>>>> inside the document (I don't trust the creators of the document).
>>>> I'd like to look up the schemas at runtime based on the namespace
>>>> attribute. Unfortunately, I haven't been able to figure out how to
>>>> tell Xerces which schema to use to validate the document.
>>>>
>>>> I know, I could specify all the schema locations programatically.
>>>> But I don't want to do that. I'd rather have Xerces ask me on
>>>> demand how to resolve the namespace to a schema document (kind of
>>>> like an EntityResolver but based on the namespace).
>>>>
>>>> Is this approach possible with Xerces? If yes, how?
>>>>
>>>> Thanks
>>>> Simon
>>>>
>>>> -------------------------------------------------------------------
>>>> --
>>>> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
>>>> For additional commands, e-mail: j-users-help@xerces.apache.org
>>>>
>>>>
>>>>
>>>
>>>
>>> --------------------------------------------------------------------
>>> -
>>> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
>>> For additional commands, e-mail: j-users-help@xerces.apache.org
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
>> For additional commands, e-mail: j-users-help@xerces.apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
> For additional commands, e-mail: j-users-help@xerces.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-users-help@xerces.apache.org
Re: Dynamic Lookup of Schema Documents
Posted by Michael Glavassevich <mr...@ca.ibm.com>.
Hi Simon,
You weren't actually using Xerces when you ran your test. The
com.sun.org.apache.xerces.internal.* packages originate from Sun's Java 5.
Regardless of whether there are schema locations in the document or not it
doesn't seem to call the LSResourceResolver. This is probably one of many
bugs which we've fixed (in the last three years) or one that never existed
since the Validator implementation in Xerces is significantly different
than the one included in Java 5.
There's one Java 5 bug [1] in particular which prevents the
SchemaFactory's factory finder from finding the implementation on the
classpath. If you had xercesImpl.jar in your classpath this would explain
why you got the JDK default instead. To select Xerces' SchemaFactory you
can set a system property -Djavax.xml.validation.SchemaFactory:
http://www.w3.org/2001/XMLSchema=org.apache.xerces.jaxp.validation.XMLSchemaFactory
. Putting the xml-apis.jar which accompanies Xerces in your JDK's endorsed
directory [2] works as well.
Once you get it working the output from your test (with the print out from
your LSResourceResolver) should look something like:
http://www.w3.org/2001/XMLSchema / http://example.com/root / null / null /
file:///C:/xmldocs/test.xml
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of
element 'root'.
at
org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:196)
at
org.apache.xerces.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:132)
at
org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:347)
at
org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:281)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2011)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:725)
at
org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:283)
at
org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(XMLNSDocumentScannerImpl.java:736)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1755)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:324)
at
org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:845)
at
org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:768)
at
org.apache.xerces.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:121)
at
org.apache.xerces.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:110)
at javax.xml.validation.Validator.validate(Unknown Source)
at SchemaTest.main(SchemaTest.java:20)
Thanks.
[1] http://marc.theaimsgroup.com/?l=xml-commons-dev&m=111898640501739&w=2
[2] http://xerces.apache.org/xerces2-j/faq-general.html#faq-4
Michael Glavassevich
XML Parser Development
IBM Toronto Lab
E-mail: mrglavas@ca.ibm.com
E-mail: mrglavas@apache.org
Simon Raess <co...@gmx.ch> wrote on 09/26/2006 12:08:38 AM:
> Hi
>
> I've tried to use it, but the LSResourceResolver was never called:
>
> public class SchemaTest {
> public static void main(String[] args) throws Exception {
> SchemaFactory factory = SchemaFactory.newInstance
> (XMLConstants.W3C_XML_SCHEMA_NS_URI);
> Schema schema = factory.newSchema();
> Validator validator = schema.newValidator();
> validator.setResourceResolver(new Resolver());
> validator.validate(new StreamSource(new File(args[0])));
> }
>
> private static class Resolver implements LSResourceResolver {
> public LSInput resolveResource(
> java.lang.String type, java.lang.String namespaceURI,
> java.lang.String publicId, java.lang.String systemId,
> java.lang.String baseURI) {
> System.out.println(type + " / " + namespaceURI + " / " +
> publicId + " / " + systemId + " / " + baseURI);
> return null;
> }
> }
> }
>
> I haven't used the Validator stuff before. Do I have to configure
> something more? My test xml looks like:
>
> <root xmlns="http://example.com/root">
> <child>test</child>
> </root>
>
> And the test program fails with the following exception:
>
> Exception in thread "main" org.xml.sax.SAXParseException: cvc-elt.1:
> Cannot find the declaration of element 'root'.
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.Util.toSAXParseExcept
> ion(Util.java:109)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ErrorHandlerAdaptor.e
> rror(ErrorHandlerAdaptor.java:104)
> at
> com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
> (XMLErrorReporter.java:382)
> at
> com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
> (XMLErrorReporter.java:316)
> at
> com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStar
> tElement(XMLSchemaValidator.java:1944)
> at
> com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startEleme
> nt(XMLSchemaValidator.java:705)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.
> startElement(ValidatorHandlerImpl.java:335)
> at
> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElemen
> t(AbstractSAXParser.java:533)
> at
> com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanSta
> rtElement(XMLNSDocumentScannerImpl.java:330)
> at
> com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl
> $NSContentDispatcher.scanRootElementHook
> (XMLNSDocumentScannerImpl.java:779)
> at
> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl
> $FragmentContentDispatcher.dispatch
> (XMLDocumentFragmentScannerImpl.java:1794)
> at
> com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.s
> canDocument(XMLDocumentFragmentScannerImpl.java:368)
> at
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
> (XML11Configuration.java:834)
> at
> com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
> (XML11Configuration.java:764)
> at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse
> (XMLParser.java:148)
> at
> com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse
> (AbstractSAXParser.java:1242)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.process
> (ValidatorImpl.java:192)
> at
> com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validat
> e(ValidatorImpl.java:159)
> at javax.xml.validation.Validator.validate(Validator.java:82)
> at SchemaTest.main(SchemaTest.java:14)
>
> Simon
>
>
>
> On 25.09.2006, at 23:06, Dick Deneer wrote:
>
> > Can't you use the LSResourceResolver in combination with the JAXP
> > Validator.
> >
> > Dick Deneer
> > Op 25-sep-2006, om 22:22 heeft Simon Raess het volgende geschreven:
> >
> >> Hi
> >>
> >> I'm developing an XML format that is extensible. The format serves
> >> as a kind of container with well-defined extension points. The
> >> following example shows a document that is similar to the format
> >> I'm using:
> >>
> >> <container xmlns="urn:container">
> >> <binding name="x"/>
> >> <access xmlns="urn:xpath">...</access>
> >> </container>
> >>
> >> I want to validate the above XML against the corresponding
> >> schemas. However, I don't want to specify the schema locations
> >> inside the document (I don't trust the creators of the document).
> >> I'd like to look up the schemas at runtime based on the namespace
> >> attribute. Unfortunately, I haven't been able to figure out how to
> >> tell Xerces which schema to use to validate the document.
> >>
> >> I know, I could specify all the schema locations programatically.
> >> But I don't want to do that. I'd rather have Xerces ask me on
> >> demand how to resolve the namespace to a schema document (kind of
> >> like an EntityResolver but based on the namespace).
> >>
> >> Is this approach possible with Xerces? If yes, how?
> >>
> >> Thanks
> >> Simon
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
> >> For additional commands, e-mail: j-users-help@xerces.apache.org
> >>
> >>
> >>
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
> > For additional commands, e-mail: j-users-help@xerces.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
> For additional commands, e-mail: j-users-help@xerces.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-users-help@xerces.apache.org
Re: Dynamic Lookup of Schema Documents
Posted by Simon Raess <co...@gmx.ch>.
Hi
I've tried to use it, but the LSResourceResolver was never called:
public class SchemaTest {
public static void main(String[] args) throws Exception {
SchemaFactory factory = SchemaFactory.newInstance
(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema();
Validator validator = schema.newValidator();
validator.setResourceResolver(new Resolver());
validator.validate(new StreamSource(new File(args[0])));
}
private static class Resolver implements LSResourceResolver {
public LSInput resolveResource(
java.lang.String type, java.lang.String namespaceURI,
java.lang.String publicId, java.lang.String systemId,
java.lang.String baseURI) {
System.out.println(type + " / " + namespaceURI + " / " +
publicId + " / " + systemId + " / " + baseURI);
return null;
}
}
}
I haven't used the Validator stuff before. Do I have to configure
something more? My test xml looks like:
<root xmlns="http://example.com/root">
<child>test</child>
</root>
And the test program fails with the following exception:
Exception in thread "main" org.xml.sax.SAXParseException: cvc-elt.1:
Cannot find the declaration of element 'root'.
at
com.sun.org.apache.xerces.internal.jaxp.validation.Util.toSAXParseExcept
ion(Util.java:109)
at
com.sun.org.apache.xerces.internal.jaxp.validation.ErrorHandlerAdaptor.e
rror(ErrorHandlerAdaptor.java:104)
at
com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
(XMLErrorReporter.java:382)
at
com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError
(XMLErrorReporter.java:316)
at
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStar
tElement(XMLSchemaValidator.java:1944)
at
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startEleme
nt(XMLSchemaValidator.java:705)
at
com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.
startElement(ValidatorHandlerImpl.java:335)
at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElemen
t(AbstractSAXParser.java:533)
at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanSta
rtElement(XMLNSDocumentScannerImpl.java:330)
at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl
$NSContentDispatcher.scanRootElementHook
(XMLNSDocumentScannerImpl.java:779)
at
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl
$FragmentContentDispatcher.dispatch
(XMLDocumentFragmentScannerImpl.java:1794)
at
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.s
canDocument(XMLDocumentFragmentScannerImpl.java:368)
at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
(XML11Configuration.java:834)
at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse
(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse
(XMLParser.java:148)
at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse
(AbstractSAXParser.java:1242)
at
com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.process
(ValidatorImpl.java:192)
at
com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validat
e(ValidatorImpl.java:159)
at javax.xml.validation.Validator.validate(Validator.java:82)
at SchemaTest.main(SchemaTest.java:14)
Simon
On 25.09.2006, at 23:06, Dick Deneer wrote:
> Can't you use the LSResourceResolver in combination with the JAXP
> Validator.
>
> Dick Deneer
> Op 25-sep-2006, om 22:22 heeft Simon Raess het volgende geschreven:
>
>> Hi
>>
>> I'm developing an XML format that is extensible. The format serves
>> as a kind of container with well-defined extension points. The
>> following example shows a document that is similar to the format
>> I'm using:
>>
>> <container xmlns="urn:container">
>> <binding name="x"/>
>> <access xmlns="urn:xpath">...</access>
>> </container>
>>
>> I want to validate the above XML against the corresponding
>> schemas. However, I don't want to specify the schema locations
>> inside the document (I don't trust the creators of the document).
>> I'd like to look up the schemas at runtime based on the namespace
>> attribute. Unfortunately, I haven't been able to figure out how to
>> tell Xerces which schema to use to validate the document.
>>
>> I know, I could specify all the schema locations programatically.
>> But I don't want to do that. I'd rather have Xerces ask me on
>> demand how to resolve the namespace to a schema document (kind of
>> like an EntityResolver but based on the namespace).
>>
>> Is this approach possible with Xerces? If yes, how?
>>
>> Thanks
>> Simon
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
>> For additional commands, e-mail: j-users-help@xerces.apache.org
>>
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
> For additional commands, e-mail: j-users-help@xerces.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-users-help@xerces.apache.org
Re: Dynamic Lookup of Schema Documents
Posted by Dick Deneer <di...@donkeydevelopment.com>.
Can't you use the LSResourceResolver in combination with the JAXP
Validator.
Dick Deneer
Op 25-sep-2006, om 22:22 heeft Simon Raess het volgende geschreven:
> Hi
>
> I'm developing an XML format that is extensible. The format serves
> as a kind of container with well-defined extension points. The
> following example shows a document that is similar to the format
> I'm using:
>
> <container xmlns="urn:container">
> <binding name="x"/>
> <access xmlns="urn:xpath">...</access>
> </container>
>
> I want to validate the above XML against the corresponding schemas.
> However, I don't want to specify the schema locations inside the
> document (I don't trust the creators of the document). I'd like to
> look up the schemas at runtime based on the namespace attribute.
> Unfortunately, I haven't been able to figure out how to tell Xerces
> which schema to use to validate the document.
>
> I know, I could specify all the schema locations programatically.
> But I don't want to do that. I'd rather have Xerces ask me on
> demand how to resolve the namespace to a schema document (kind of
> like an EntityResolver but based on the namespace).
>
> Is this approach possible with Xerces? If yes, how?
>
> Thanks
> Simon
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
> For additional commands, e-mail: j-users-help@xerces.apache.org
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: j-users-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-users-help@xerces.apache.org