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
------------------------------------------------------------------------
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