XML validation using xml schema string 2003-01-23 - By Jeff Greif
Something like this (just typed into mail message, neither compiled nor tested).
in main:
DomParser parser = new DomParser(); parser.setEntityResolver(new MyEntityResolver(parser.getEntityResolver(),
mySchemaString, myfakeSchemaLocationURI));
class MyEntityResolver { InputSource source; EntityResolver defaultResolver; String fakeLocationURI; public MyEntityResolver(EntityResolver default, String mySchemaString, String fakeLocationURI) { source = new InputSource(new StringReader(mySchemaString)); defaultResolver = default; this.fakeLocationURI = fakeLocationURI; } public InputSource resolveEntity(String pubId, String sysId) { if ((pubId != null && pubId.equals(fakeLocationURI)) || (sysId != null && sysId.equals(fakeLocationURI))) { return source; } return defaultResolver.resolveEntity(pubId, sysId); }
}
Jeff ----- Original Message ----- From: "Praveen Peddi" <ppeddi@(protected)> To: <xerces-j-user@(protected)> Sent: Thursday, January 23, 2003 10:51 AM Subject: Re: XML validation using xml schema string
> Jeff, > I think I didn't get you completely. > > Could you please write a sample code or modify my code below so that I can > understand what you are syaing. > > Thanks > Praveen > ----- Original Message ----- > From: "Jeff Greif" <jgreif@(protected)> > To: <xerces-j-user@(protected)> > Sent: Thursday, January 23, 2003 11:28 AM > Subject: Re: XML validation using xml schema string > > > > I'm not able to give information correct in detail, but here is an outline > > of what must happen: > > > > The entity resolver is called with a namespace URI or a schema location as > > an argument, I think. In the course of parsing your instance document > (.xml > > file), it will be called to process your schema's namespace and possibly > > other namespaces (e.g. the XMLSchema-instance namespace) mentioned > therein. > > Probably you should get the default entity resolver for the parser (which > > knows how to handle some things, presumably), and create your own entity > > resolver holding that one as a member. Then when asked for a particular > > schema by its namespace or location, if it's your schema, return the input > > source as your code below does, otherwise, pass the request to the member > > resolver which knows better than you what to do. > > > > Jeff > > > > ----- Original Message ----- > > From: "Praveen Peddi" <ppeddi@(protected)> > > To: <xerces-j-user@(protected)> > > Sent: Thursday, January 23, 2003 7:44 AM > > Subject: Re: XML validation using xml schema string > > > > > > > I posted a question yesterday about the validation of XML against the > > local > > > schema (in memory). Could anyone please look at the message below and > > reply > > > if you know the answer. > > > > > > Thanks in Advance. > > > > > > Praveen > > > ----- Original Message ----- > > > From: "Praveen Peddi" <ppeddi@(protected)> > > > To: <sandygao@(protected)>; <xerces-j-user@(protected)> > > > Sent: Wednesday, January 22, 2003 1:35 PM > > > Subject: Re: XML validation using xml schema string > > > > > > > > > > As you said I wrote an EntityResolver but it didn't work. Could you > send > > > me > > > > a sample code (just the validation code) if u already have one. > > > > > > > > My validate method looks as follows: > > > > > > > > public static void validateXmlAgainstLocalSchema(String XMLString, > > String > > > > schemaString) throws SAXException{ > > > > long startTime = System.currentTimeMillis(); > > > > System.out.println("Files: XML:" + XMLString + " XSD:" + > > > > schemaString); > > > > XMLReader parser = null; > > > > // Instantiate a parser > > > > try{ > > > > parser = > > > > > XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); > > > > } catch (org.xml.sax.SAXException ex){ > > > > System.out.println("SAXException Exception"); > > > > throw new SAXException("Error Obtaining the parser."); > > > > } > > > > > > > > try{ > > > > > > > > // Register the error handler > > > > parser.setErrorHandler(new SchemaErrorHandler()); > > > > > > > > > > > > > > > > > > //parser.setFeature("http://apache.org/xml/features/continue-after-fatal-err > > > > or", true); > > > > // Turn on validation > > > > > > > > parser.setFeature("http://xml.org/sax/features/namespaces",true); > > > > > > > parser.setFeature("http://xml.org/sax/features/validation", > > > > true); > > > > > > > > > > > > > > parser.setFeature("http://apache.org/xml/features/validation/schema",true); > > > > > > > > > > > > > > parser.setFeature("http://apache.org/xml/features/validation/schema-full-che > > > > cking",true); > > > > > > > > > > > > > > //parser.setProperty("http://apache.org/xml/properties/schema/external-noNam > > > > espaceSchemaLocation",Schema); > > > > parser.setEntityResolver(new SchemaEntityResolver(schemaString)); > > > > > > > > > > > > } catch (org.xml.sax.SAXNotRecognizedException ex){ > > > > ex.printStackTrace(); > > > > System.out.println("SAXNotRecognizedException > > > > Exception"); > > > > } catch (org.xml.sax.SAXNotSupportedException ex){ > > > > ex.printStackTrace(); > > > > System.out.println("SAXNotSupportedException > > > > Exception"); > > > > } > > > > > > > > // Parse the document > > > > try{ > > > > //String XMLSystemId = new > > > > File(XMLString).toURL().toExternalForm(); > > > > parser.parse(new InputSource(new > > > StringReader(XMLString))); > > > > //parser.parse(XMLSystemId); > > > > System.out.println("Parsed Successfully by SAX > Parser"); > > > > } catch (org.xml.sax.SAXException ex){ > > > > System.out.println("SAXException Exception"); > > > > throw new SAXException("Error Validating the content XML."); > > > > } catch (java.io.IOException ex){ > > > > System.out.println("IOException Exception"); > > > > throw new SAXException("Error Validating the content XML."); > > > > } finally { > > > > long endTime = System.currentTimeMillis(); > > > > System.out.println("Total time of > > > > SAXValidate:"+(endTime-startTime)); > > > > } > > > > }//SAXValidate > > > > > > > > And SchemaEntityResolver looks as follows: > > > > > > > > public class SchemaEntityResolver implements EntityResolver { > > > > InputSource source = null; > > > > public SchemaEntityResolver(String schemaString) { > > > > source = new InputSource(new StringReader(schemaString)); > > > > } > > > > > > > > public InputSource resolveEntity(String publicID, String systemID) > > > > throws SAXException { > > > > return source; > > > > } > > > > } > > > > > > > > When I try to validate an xml with the schema string, I get the > > following > > > > error: > > > > Line: 1 > > > > URI: null > > > > Message: cvc-elt.1: Cannot find the declaration of element > 'content'. > > > > > > > > > > > > Am I doing it wrong? If so please tell me how to use the > entityresolver. > > > > > > > > Praveen > > > > > > > > > > > > ----- Original Message ----- > > > > From: <sandygao@(protected)> > > > > To: <xerces-j-user@(protected)> > > > > Sent: Monday, January 20, 2003 10:18 AM > > > > Subject: Re: XML validation using xml schema string > > > > > > > > > > > > > Write an entity resolver > > > > > > > > > > > > > > > (http://xml.apache.org/xerces2-j/javadocs/api/org/xml/sax/EntityResolver.htm > > > > l), > > > > > > > > > > and returned an input source with a StringReader when the schema > > > document > > > > > is asked. > > > > > > > > > > HTH, > > > > > Sandy Gao > > > > > Software Developer, IBM Canada > > > > > (1-905) 413-3255 > > > > > sandygao@(protected) > > > > > > > > > > > > > > > > > > > > > > > > > "Praveen Peddi" > > > > > <ppeddi@(protected) To: > > > > <xerces-j-user@(protected)> > > > > > dia.com> cc: > > > > > Subject: Re: XML > > > > validation using xml schema string > > > > > 01/20/2003 09:16 > > > > > AM > > > > > Please respond to > > > > > xerces-j-user > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hi all, > > > > > Last week I sent an email regarding the xml validation against the > > > schema, > > > > > but didn't get any reply. Please reply if any one has answer to my > > > > > question. Is it possible to validate an xml document using a schema > > > > > document (not the schema url) that is present with in the > application. > > > If > > > > > its not possible, whats the best way of achieving it. Please read my > > > > > previous email below. > > > > > > > > > > Thanks > > > > > Praveen > > > > > > > > > > Hi all, > > > > > I want to validate an xml document with an existing schema. I know > > > there > > > > > is a code to do it when the schema is present as a URL. BUt in my > > case > > > > > schema is present with in the application memory (since it is > stored > > in > > > > > the database) and that is not the url or on the hard disk. > > > > > I have the following method which validates only when the schema is > > > > > present externally. Note that the argument Schema is a URL: > > > > > public static void DOMValidate(String XMLfile, String Schema){ > > > > > long startTime = System.currentTimeMillis(); > > > > > > > > > > // Instantiate the DOM parser. > > > > > DOMParser parser = new DOMParser(); > > > > > > > > > > // set the features > > > > > try{ > > > > > > parser.setFeature("http://xml.org/sax/features/namespaces > > > > > ",true); > > > > > > > parser.setFeature("http://xml.org/sax/features/validation", > > > > > true); > > > > > parser.setFeature(" > > > > > http://apache.org/xml/features/validation/schema",true); > > > > > parser.setFeature(" > > > > > > > http://apache.org/xml/features/validation/schema-full-checking",true); > > > > > // convert the xml file name to a URL > > > > > String SystemId = null; > > > > > try{ > > > > > SystemId = new > File(Schema).toURL().toExternalForm(); > > > > > } catch(java.net.MalformedURLException ex){ > > > > > //ex.printStackTrace(); > > > > > log.error(ex); > > > > > } > > > > > parser.setProperty(" > > > > > > > > > > > http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation > > > > > ",SystemId); > > > > > // myErrorHandler is a descendant of ErrorHandler, it > > > should > > > > > be set here to be able to catch parse errors > > > > > parser.setErrorHandler(new SchemaErrorHandler()); > > > > > > > > > > } catch (SAXNotSupportedException ex){ > > > > > System.out.println("SAXNotSupportedException > Exception"); > > > > > } catch (SAXNotRecognizedException ex){ > > > > > System.out.println("SAXNotRecognizedException > > > > Exception"); > > > > > } > > > > > > > > > > // parse the xml file, the errorhandler class has > callbacks, > > > > > // so those will be called automatically there is a parse > > error > > > > > try{ > > > > > parser.parse(new > > > File(XMLfile).toURL().toExternalForm()); > > > > > //System.out.println("Parsed Successfully by DOM > > > > Parser"); > > > > > } catch (org.xml.sax.SAXException ex){ > > > > > //System.out.println("SAXException Exception"); > > > > > //ex.printStackTrace(); > > > > > log.error(ex); > > > > > } catch (java.io.IOException ex){ > > > > > System.out.println("IOException Exception"); > > > > > } finally { > > > > > long endTime = System.currentTimeMillis(); > > > > > //System.out.println("Total time of DOMValidate:" > > > > > +(endTime-startTime)); > > > > > > > > > > } > > > > > > > > > > } > > > > > > > > > > How can I do the validation if the Schema is the actual schema > string > > > not > > > > > the url. This looks like a common problem. I assume that its not > > > > universal > > > > > that schema is not always stored externally. > > > > > > > > > > Any suggestions are appreciated. > > > > > > > > > > Praveen > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > > To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) > > > > > For additional commands, e-mail: xerces-j-user-help@(protected) > > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) > > > > For additional commands, e-mail: xerces-j-user-help@(protected) > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) > > > For additional commands, e-mail: xerces-j-user-help@(protected) > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) > > For additional commands, e-mail: xerces-j-user-help@(protected) > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) > For additional commands, e-mail: xerces-j-user-help@(protected) > >
--------------------------------------------------------------------- To unsubscribe, e-mail: xerces-j-user-unsubscribe@(protected) For additional commands, e-mail: xerces-j-user-help@(protected)
|
|