Hi, I am developing a simple generic (wsdl/schema-independent) SOAP message validatior class that uses Xerces. The problem I have is that I use an string based schema (not an URI nor a file) because I want to use WSDL's schema. The validation only works when an schema location is specified in the XML instance:
<fi:fish xmlns:fi="http://globalip:8080/fish" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://globalip:8080/fish http://192.168.82.29:8080/fisherWS/fish.xsd"> But I would like it to work without schema location: <fi:fish xmlns:fi="http://globalip:8080/fish"> I have been reading the Xerces doc (properties and features) and I coded the config in such a way: private String VALIDATION = "http://xml.org/sax/features/validation"; private String SCHEMA = "http://apache.org/xml/features/validation/schema"; private String SCHEMA_FULL_CHECKING = "http://apache.org/xml/features/validation/schema-full-checking"; private String WARN_ON_DUPLICATE_ATTDEF = "http://apache.org/xml/features/validation/warn-on-duplicate-attdef"; parser.setFeature(LOAD_EXTERNAL_DTD, true); parser.setFeature(VALIDATION, true); parser.setFeature(SCHEMA, true); parser.setFeature(SCHEMA_FULL_CHECKING, true); parser.setFeature(WARN_ON_DUPLICATE_ATTDEF, true); Thanks in advance, Pau The full source code is: import org.w3c.dom.*; import java.io.FileNotFoundException; import java.net.UnknownHostException; import org.w3c.dom.Element; import org.xml.sax.SAXParseException; import org.xml.sax.SAXException; import org.xml.sax.ErrorHandler; import org.xml.sax.helpers.XMLReaderFactory; import org.xml.sax.InputSource; import java.io.StringReader; import javax.xml.soap.SOAPBody; import org.xml.sax.XMLReader; import javax.xml.soap.SOAPEnvelope; import org.apache.axis.MessageContext; import org.apache.catalina.util.SchemaResolver; import org.xml.sax.helpers.DefaultHandler; import java.io.IOException; import org.apache.tomcat.util.digester.Digester; public class SOAPvalidator { private String VALIDATION = "http://xml.org/sax/features/validation"; private String SCHEMA = "http://apache.org/xml/features/validation/schema"; /** * String constant used for the schema full checking feature of the Xerces * parser. * * @build 10 */ private String SCHEMA_FULL_CHECKING = "http://apache.org/xml/features/validation/schema-full-checking"; /** * String constant used for the warn on duplicate attribute definition * feature of the Xerces parser. * * @build 10 */ private String WARN_ON_DUPLICATE_ATTDEF = "http://apache.org/xml/features/validation/warn-on-duplicate-attdef"; /** * String constant used for the warn on undeclared element definition * feature of the Xerces parser. * * @build 10 */ private String LOAD_EXTERNAL_DTD = "http://apache.org/xml/features/nonvalidating/load-external-dtd"; // Name of the parser to use to create the xmlReader. String parserName = "org.apache.xerces.parsers.SAXParser"; XMLReader parser = null; DefaultHandler defaultHandler = null; public SOAPvalidator() { try { parser = XMLReaderFactory.createXMLReader(parserName); // load schema\dtd parser.setFeature(LOAD_EXTERNAL_DTD, true); // turn on validation parser.setFeature(VALIDATION, true); parser.setFeature(SCHEMA, true); parser.setFeature(SCHEMA_FULL_CHECKING, true); parser.setFeature(WARN_ON_DUPLICATE_ATTDEF, true); defaultHandler = new SAXErrorHandler(); } catch (Exception e) { } } public void validateSOAPmessage() { try { MessageContext context = org.apache.axis.MessageContext .getCurrentContext(); SOAPEnvelope env = context.getRequestMessage().getSOAPEnvelope(); SOAPBody sb = env.getBody(); System.out.println("SB fc: " + sb.getLastChild()); String XMLinstance = sb.getLastChild().toString(); SAXErrorHandler errorHandler = new SAXErrorHandler(); validateFile(new InputSource(new StringReader(XMLinstance)), errorHandler); } catch (Exception e) { } } public void validateFile(InputSource source, DefaultHandler handler) throws SAXException, IOException { Digester digester = new Digester(parser); // make schema resolver so the parser knows where to find the schema SchemaResolver resolver = new SchemaResolver(digester); parser.setEntityResolver(resolver); parser.setErrorHandler(handler); // parsing the file with validation turned on no content handler needed parser.parse(source); } } /** * This class is used to handle any errors that occur durring parsing. * * @build 10 */ class SAXErrorHandler extends DefaultHandler { /** * Called by parser when an error is encountered while parsing the XML file. * * @build 10 * @param ex * is th exception that describes the error */ public void error(SAXParseException ex) { System.out.println("SOAP message error: " + ex.getMessage()); // parseError.append("\n"); // parseError.append(ex.getMessage()); // errorCount++; } /** * Called by parser when an fatalError is encountered while parsing the XML * file. * * @build 10 * @param ex * is th exception that describes the error */ public void fatalError(SAXParseException ex) { System.out.println("SOAP message fatal error: " + ex.getMessage()); // parseError.append("\n"); // parseError.append(ex.getMessage()); // errorCount++; } /** * Called by parser when an warning is encountered while parsing the XML * file. * * @build 10 * @param ex * is th exception that describes the error */ public void warning(SAXParseException ex) { System.out.println("SOAP message warning: " + ex.getMessage()); // parseError.append("\n"); // parseError.append(ex.getMessage()); // errorCount++; } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]