mmonshausen
Grünschnabel
Hallo,
ich habe ein kniffliches Problem: Ich habe ein Servlet, dass eine WSDL-Datei parsed, daraus ein Eingabe-Formular erstellt in das der Benutzer seine Eingaben machen kann, so dass er Web-Services testen kann. Die Eingaben werden an ein anderes Servlet gesandt, wo ich den Request zusammenbaue. Dort will ich nun auch eine Validierung der Eingaben entsprechend dem Schema in der WSDL-Datei machen.
Zur Validierung setze ich javax.xml.validation.Validator ein. Wenn ich nun den Validator auf meine Nachricht loslasse, so erhalte ich immer den Fehler "org.xml.sax.SAXParseException:
cvc-complex-type.2.4.d: Invalid content was found starting with element
'CityName'. No child element is expected at this point."
Der WebService der die Nachricht erhält liefert aber das korrekte Ergebnis zurück, so dass ich nicht glaube das die Nachricht wirklich falsch ist...
Mein Schema sieht (verkürzt) so aus:
<s:schema elementFormDefault='qualified' targetNamespace='http://www.webserviceX.NET' xmlns:s='http://www.w3.org/2001/XMLSchema'>
<s:element name='GetWeather'>
<s:complexType>
<s:sequence>
<s:element maxOccurs='1' minOccurs='0' name='CityName' type='s:string'/>
<s:element maxOccurs='1' minOccurs='0' name='CountryName' type='s:string'/>
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
Mein XML-Dokument so:
<GetWeather xmlns="http://www.webserviceX.NET">
<CountryName>Germany</CountryName>
<CityName>Mannheim</CityName>
</GetWeather>
meine Validator-Methode sieht (verkürzt (z.T. ohne try / catch) so aus:
private boolean validate(String message, String msgSchema)
{
boolean valid = true;
Document document = null;
Validator validator = null;
// parse an XML document into a DOM tree
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// this is an workaround for a bug in JDK 6 and JAX
dbf.setNamespaceAware(true);
DocumentBuilder parser = dbf.newDocumentBuilder();
document = parser.parse(new InputSource(new StringReader(message)));
//parse the schema
SchemaFactory factory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new StringReader(msgSchema));
Schema schema = factory.newSchema(schemaFile);
// create a Validator instance
validator = schema.newValidator();
// try to validate the message
try { validator.validate(new DOMSource(document)); }
catch (SAXException e)
{
valid = false;
e.printStackTrace();
}
}
Kann mir bitte jemand einen Tipp geben, was ich da falsch gemacht habe...
Vielen Dank,
Martin
ich habe ein kniffliches Problem: Ich habe ein Servlet, dass eine WSDL-Datei parsed, daraus ein Eingabe-Formular erstellt in das der Benutzer seine Eingaben machen kann, so dass er Web-Services testen kann. Die Eingaben werden an ein anderes Servlet gesandt, wo ich den Request zusammenbaue. Dort will ich nun auch eine Validierung der Eingaben entsprechend dem Schema in der WSDL-Datei machen.
Zur Validierung setze ich javax.xml.validation.Validator ein. Wenn ich nun den Validator auf meine Nachricht loslasse, so erhalte ich immer den Fehler "org.xml.sax.SAXParseException:
cvc-complex-type.2.4.d: Invalid content was found starting with element
'CityName'. No child element is expected at this point."
Der WebService der die Nachricht erhält liefert aber das korrekte Ergebnis zurück, so dass ich nicht glaube das die Nachricht wirklich falsch ist...
Mein Schema sieht (verkürzt) so aus:
<s:schema elementFormDefault='qualified' targetNamespace='http://www.webserviceX.NET' xmlns:s='http://www.w3.org/2001/XMLSchema'>
<s:element name='GetWeather'>
<s:complexType>
<s:sequence>
<s:element maxOccurs='1' minOccurs='0' name='CityName' type='s:string'/>
<s:element maxOccurs='1' minOccurs='0' name='CountryName' type='s:string'/>
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
Mein XML-Dokument so:
<GetWeather xmlns="http://www.webserviceX.NET">
<CountryName>Germany</CountryName>
<CityName>Mannheim</CityName>
</GetWeather>
meine Validator-Methode sieht (verkürzt (z.T. ohne try / catch) so aus:
private boolean validate(String message, String msgSchema)
{
boolean valid = true;
Document document = null;
Validator validator = null;
// parse an XML document into a DOM tree
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// this is an workaround for a bug in JDK 6 and JAX
dbf.setNamespaceAware(true);
DocumentBuilder parser = dbf.newDocumentBuilder();
document = parser.parse(new InputSource(new StringReader(message)));
//parse the schema
SchemaFactory factory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new StringReader(msgSchema));
Schema schema = factory.newSchema(schemaFile);
// create a Validator instance
validator = schema.newValidator();
// try to validate the message
try { validator.validate(new DOMSource(document)); }
catch (SAXException e)
{
valid = false;
e.printStackTrace();
}
}
Kann mir bitte jemand einen Tipp geben, was ich da falsch gemacht habe...
Vielen Dank,
Martin