osdir.com
mailing list archive

Subject: Re: parsing validation xml attribut required non present - msg#00086

List: text.xml.french.tech

Date: Prev Next Index Thread: Prev Next Index
Bonjour,

On jeu, 2005-05-12 at 15:53 +0200, Jérôme Macé wrote:

.../...

> generalSOAPmessage.xsd : (envelope.xsd est le schema d'une enveloppe SOAP)
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";>
> <!-- Standard SOAP schemas -->
> <xs:import schemaLocation="envelope.xsd"
> namespace="http://schemas.xmlsoap.org/soap/envelope/"/>
> <xs:import schemaLocation="encoding.xsd"
> namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> <!-- Local schemas -->
> <xs:import schemaLocation="schema1.xsd" namespace="urn:appli:schema1"/>
> <xs:import schemaLocation="schema2.xsd" namespace="urn:appli:schema2"/>
> </xs:schema>
>
>
>
>
> schema1.xsd (schema d'une des operations du service Web) :
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema targetNamespace="urn:appli:schema1"
> xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:appli="urn:appli:schema1"
> elementFormDefault="qualified" attributeFormDefault="unqualified">
> <xs:element name="operation1">
> <xs:complexType>
> <xs:attribute ref="appli:attribute1" use="required"/>
> </xs:complexType>
> </xs:element>
> <xs:attribute name="attribute1">
> <xs:simpleType>
> <xs:restriction base="xs:string">
> <xs:enumeration value="param1"/>
> <xs:enumeration value="param2"/>
> <xs:enumeration value="param3"/>
> </xs:restriction>
> </xs:simpleType>
> </xs:attribute>
> </xs:schema>
>
>
>
> AU niveau du client :
>
> Le message SOAP suivant est envoyé. Le problème est qu'il est considéré
> comme valide par le parser,
> alors qu'il ne devrait pas (il manque l'attribut 'attribute1' qui est
> 'required') :
>
> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
> xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
> <soapenv:Body>
> <operation1/>
> </soapenv:Body>
> </soapenv:Envelope>
>
>
>
> Auriez-vous une idée sur l'origine du problème ?

Peut-être :-) ...

Pour que ce que vous montrez fonctionne, il faut plusieurs conditions
dont une au moins n'est pas vérifiée :-) :

1. le schéma SOAP doit accepter votre élément <operation1/> soit
explicitement, soit au moyen d'un xs:any dont l'attribut
processContents est soit "lax" soit "strict".
2. l'espace de noms de <operation1/> doit correspondre à celui du
schéma le décrivant. Ce n'est pas le cas ici et il faut ajouter
quelque part un xmlns="urn:appli:schema1".

Attention également à l'espace de noms de votre attribut. Celui-ci est
défini de manière globale, ce qui impose qu'il soit préfixé dans votre
document.

Vous devrez donc impérativement écrire :

<operation1 xmlns="urn:appli:schema1" xmlns:a="urn:appli:schema1"
a:attribute1="..."/>

ou

<a:operation1 xmlns:a="urn:appli:schema1" a:attribute1="..."/>

Pour éviter cela et pouvoir écrire :

<operation1 xmlns="urn:appli:schema1" attribute1="..."/>

le plus simple est d'éviter la définition globale :

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:appli:schema1"
xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:appli="urn:appli:schema1"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="operation1">
<xs:complexType>
<xs:attribute name="attribute1" type="appli:attribute1"
use="required"/>
</xs:complexType>
</xs:element>

<xs:simpleType name="attribute1">
<xs:restriction base="xs:string">
<xs:enumeration value="param1"/>
<xs:enumeration value="param2"/>
<xs:enumeration value="param3"/>
</xs:restriction>
</xs:simpleType>

</xs:schema>

Cordialement,

Eric van der Vlist


--
Lisez-moi sur XMLfr.
http://xmlfr.org/index/person/eric+van+der+vlist/
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------




Was this page helpful?
Yes No
Thread at a glance:

Previous Message by Date: click to view message preview

parsing validation xml attribut required non present

Bonjour à tous, J'aurais besoin d'aide concernant la validation d'un message SOAP par rapport à son schema XML. J'ai un client qui envoie des messages SOAP sur mon serveur. J'aimerais que le serveur valide ces messages avant d'essayer de les traiter. AU niveau du serveur : Le code du parser est le suivant : try { factory = SAXParserFactory.newInstance(); factory.setValidating(true); factory.setNamespaceAware(true); if (!factory.isValidating()){ throw new AxisFault("Internal error : the server is not able to validating the SOAP messages"); } //Create Parser parser = factory.newSAXParser(); // Enable Schemas parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "<..path..>/generalSOAPmessage.xsd"); //Create XMLReader xmlReader = parser.getXMLReader(); ValidatorHandler handler = new ValidatorHandler(); xmlReader.setErrorHandler(handler); //convert xml string to document InputStream inputStream = new ByteArrayInputStream(req.getAsString().getBytes("UTF-8")); // req est le message SOAP InputSource inputSource = new InputSource(inputStream); xmlReader.parse(inputSource); if(handler.validationError==true) { throw new AxisFault("Error"); } } catch (ParserConfigurationException e){ throw new AxisFault("Internal error : parser configuration error ..."); } catch (SAXException e){ throw new AxisFault("Internal error : sax exception ... : "+ e.getMessage()); } catch (Exception e){ throw new AxisFault("Internal error : " + e.getMessage()); } generalSOAPmessage.xsd : (envelope.xsd est le schema d'une enveloppe SOAP) <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- Standard SOAP schemas --> <xs:import schemaLocation="envelope.xsd" namespace="http://schemas.xmlsoap.org/soap/envelope/"/> <xs:import schemaLocation="encoding.xsd" namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <!-- Local schemas --> <xs:import schemaLocation="schema1.xsd" namespace="urn:appli:schema1"/> <xs:import schemaLocation="schema2.xsd" namespace="urn:appli:schema2"/> </xs:schema> schema1.xsd (schema d'une des operations du service Web) : <?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="urn:appli:schema1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:appli="urn:appli:schema1" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="operation1"> <xs:complexType> <xs:attribute ref="appli:attribute1" use="required"/> </xs:complexType> </xs:element> <xs:attribute name="attribute1"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="param1"/> <xs:enumeration value="param2"/> <xs:enumeration value="param3"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:schema> AU niveau du client : Le message SOAP suivant est envoyé. Le problème est qu'il est considéré comme valide par le parser, alors qu'il ne devrait pas (il manque l'attribut 'attribute1' qui est 'required') : <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <operation1/> </soapenv:Body> </soapenv:Envelope> Auriez-vous une idée sur l'origine du problème ? Existe t-il une autre solution pour valider un message SOAP par rapport à un schema XML ? Merci d'avance pour votre aide. Cordialement, Jérôme. _________________________________________________________________ MSN Hotmail : antivirus et antispam gratuits http://www.imagine-msn.com/hotmail/default.aspx?locale=fr-FR

Next Message by Date: click to view message preview

Re: parsing validation xml attribut required non present

Eric, Tout d'abord merci pour votre aide. Concernant le premier point je pense qu'il ne devrait pas y avoir de problèmes. Le schema SOAP est celui situé à cette adresse : http://schemas.xmlsoap.org/soap/envelope/ <xs:complexType name="Body"> <xs:sequence> <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/> </xs:sequence> <xs:anyAttribute namespace="##any" processContents="lax"> <xs:annotation> <xs:documentation> Prose in the spec does not specify that attributes are allowed on the Body element </xs:documentation> </xs:annotation> </xs:anyAttribute> </xs:complexType> En ce qui concerne le second point, je ne suis pas sûr d'avoir très bien compris. Je souhaiterais en fait que lorsque j'envoie un message erroné (sans attribut et sans espace de nom, juste le nom de l'opération à invoquer), le parser refuse le message en le declarant invalide par rapport au schema xml de l'operation. En fait le message correct pour l'opération serait : <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <operation1 xmlns="urn:appli:schema1" xmlns:a="urn:appli:schema1" a:attribute1="..."/> </soapenv:Body> </soapenv:Envelope> et j'aimerais que le service Web (parser invalide le message) me rejete le message : <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <operation1/> </soapenv:Body> </soapenv:Envelope> Je ne sais pas si c'est possible ... Merci beaucoup de votre aide. Cordialement, Jérôme. _________________________________________________________________ MSN Hotmail : choisissez votre adresse @hotmail.fr http://www.imagine-msn.com/hotmail/default.aspx?locale=fr-FR

Previous Message by Thread: click to view message preview

parsing validation xml attribut required non present

Bonjour à tous, J'aurais besoin d'aide concernant la validation d'un message SOAP par rapport à son schema XML. J'ai un client qui envoie des messages SOAP sur mon serveur. J'aimerais que le serveur valide ces messages avant d'essayer de les traiter. AU niveau du serveur : Le code du parser est le suivant : try { factory = SAXParserFactory.newInstance(); factory.setValidating(true); factory.setNamespaceAware(true); if (!factory.isValidating()){ throw new AxisFault("Internal error : the server is not able to validating the SOAP messages"); } //Create Parser parser = factory.newSAXParser(); // Enable Schemas parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "<..path..>/generalSOAPmessage.xsd"); //Create XMLReader xmlReader = parser.getXMLReader(); ValidatorHandler handler = new ValidatorHandler(); xmlReader.setErrorHandler(handler); //convert xml string to document InputStream inputStream = new ByteArrayInputStream(req.getAsString().getBytes("UTF-8")); // req est le message SOAP InputSource inputSource = new InputSource(inputStream); xmlReader.parse(inputSource); if(handler.validationError==true) { throw new AxisFault("Error"); } } catch (ParserConfigurationException e){ throw new AxisFault("Internal error : parser configuration error ..."); } catch (SAXException e){ throw new AxisFault("Internal error : sax exception ... : "+ e.getMessage()); } catch (Exception e){ throw new AxisFault("Internal error : " + e.getMessage()); } generalSOAPmessage.xsd : (envelope.xsd est le schema d'une enveloppe SOAP) <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- Standard SOAP schemas --> <xs:import schemaLocation="envelope.xsd" namespace="http://schemas.xmlsoap.org/soap/envelope/"/> <xs:import schemaLocation="encoding.xsd" namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <!-- Local schemas --> <xs:import schemaLocation="schema1.xsd" namespace="urn:appli:schema1"/> <xs:import schemaLocation="schema2.xsd" namespace="urn:appli:schema2"/> </xs:schema> schema1.xsd (schema d'une des operations du service Web) : <?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="urn:appli:schema1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:appli="urn:appli:schema1" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="operation1"> <xs:complexType> <xs:attribute ref="appli:attribute1" use="required"/> </xs:complexType> </xs:element> <xs:attribute name="attribute1"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="param1"/> <xs:enumeration value="param2"/> <xs:enumeration value="param3"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:schema> AU niveau du client : Le message SOAP suivant est envoyé. Le problème est qu'il est considéré comme valide par le parser, alors qu'il ne devrait pas (il manque l'attribut 'attribute1' qui est 'required') : <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <operation1/> </soapenv:Body> </soapenv:Envelope> Auriez-vous une idée sur l'origine du problème ? Existe t-il une autre solution pour valider un message SOAP par rapport à un schema XML ? Merci d'avance pour votre aide. Cordialement, Jérôme. _________________________________________________________________ MSN Hotmail : antivirus et antispam gratuits http://www.imagine-msn.com/hotmail/default.aspx?locale=fr-FR

Next Message by Thread: click to view message preview

Re: parsing validation xml attribut required non present

Eric, Tout d'abord merci pour votre aide. Concernant le premier point je pense qu'il ne devrait pas y avoir de problèmes. Le schema SOAP est celui situé à cette adresse : http://schemas.xmlsoap.org/soap/envelope/ <xs:complexType name="Body"> <xs:sequence> <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/> </xs:sequence> <xs:anyAttribute namespace="##any" processContents="lax"> <xs:annotation> <xs:documentation> Prose in the spec does not specify that attributes are allowed on the Body element </xs:documentation> </xs:annotation> </xs:anyAttribute> </xs:complexType> En ce qui concerne le second point, je ne suis pas sûr d'avoir très bien compris. Je souhaiterais en fait que lorsque j'envoie un message erroné (sans attribut et sans espace de nom, juste le nom de l'opération à invoquer), le parser refuse le message en le declarant invalide par rapport au schema xml de l'operation. En fait le message correct pour l'opération serait : <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <operation1 xmlns="urn:appli:schema1" xmlns:a="urn:appli:schema1" a:attribute1="..."/> </soapenv:Body> </soapenv:Envelope> et j'aimerais que le service Web (parser invalide le message) me rejete le message : <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <operation1/> </soapenv:Body> </soapenv:Envelope> Je ne sais pas si c'est possible ... Merci beaucoup de votre aide. Cordialement, Jérôme. _________________________________________________________________ MSN Hotmail : choisissez votre adresse @hotmail.fr http://www.imagine-msn.com/hotmail/default.aspx?locale=fr-FR
Sign up for updates to this mailing list. email:
Loading Comments...
Home | News | Patents | Sitemap | FAQ | advertise

Advertising by