- From: <vletrmx21@inwind.it>
- Date: Thu, 24 Jul 2003 18:31:50 +0200
- To: "xmlschema-dev" <xmlschema-dev@w3.org>
Yes, obviously you were right. Thank you for your answer.
Now I only have this error:
org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'encodingStyle' is not allowed to appear in element 'SOAP:Envelope'.
And my xml document root looks as follows:
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope" SOAP:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
I've checked the envelope schema and it seems the attribute declaration is global.
Another thing I haven't quite understood (but that may be because I'm a newbie to schemas and xml validation and I haven't had the chance to study properly) is how the validating parser finds the schemas I use in my xml and xsd documents. I use Xerces 2.4.0, and my xml document doesn't have a link to an external schema document, so I have to set that in my code:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage","http://www.w3.org/2001/XMLSchema");
//String[] schemas = new String[]{schema, "envelopeSchema.xsd", "xmldsigSchema.xsd"};
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schema);
where schema is the String containing the path to my xsd, which the application finds. But to have it work I have to use the schemaLocation attribute in my xsd import elements to set the path of the imported schema files (which I have saved locally from http://schemas.xmlsoap.org/soap/envelope and http://www.w3.org/2000/09/xmldsig#: did I really need to do that?).
From the w3c schema specification, in the section about the import element:
"The ·actual value· of the schemaLocation, if present, gives a hint as to where a serialization of a ·schema document· with declarations and definitions for that namespace (or none) may be found. When no schemaLocation [attribute] is present, the schema author is leaving the identification of that schema to the instance, application or user, via the mechanisms described below..."
That's exactly what I wanted to do: leave the identification of that schema to the application. And I tried to do that using the following code:
String[] schemas = new String[]{schema, "envelopeSchema.xsd", "xmldsigSchema.xsd"};
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schemas);
But it just doesn't seem to work, because, after removing the schemaLocation attribute, I get the same error whether I set the above attribute with my custom schema or with the array of schemas, and the error is:
org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'soap:mustUnderstand' to a(n) attribute declaration component.
So it seems the parser has an internal representation of the schemas I downloaded (for instance, that of the soap envelope), as I expected, but slightly different from the latest one. Is my assumption right?
Anyway, is there a way to do that programmatically (tell the parser which file to use to resolve the import statements)?
Thanks,
MJ
> I think that the problem is that the namespaces don't quite match.
> You've declared the SOAP namespace as:
>
> http://schemas.xmlsoap.org/soap/envelope
>
> but you're importing the namespace:
>
> http://schemas.xmlsoap.org/soap/envelope/
> ^
> remove the extra slash -------------------| and it should work.
>
> Cheers,
>
> Jeni
>
> ---
> Jeni Tennison
> http://www.jenitennison.com/
>
>
Received on Thursday, 24 July 2003 12:35:14 UTC