You're probably getting null because:

1) Your document isn't valid.

2) You're mixing orthogonal validation mechanisms. Setting the validation 
features on the factory in addition to setting a Schema causes your 
document to be validated twice: once by the parser's internal schema 
validator (which would have no idea where your schema is since your 
document doesn't contain a schemaLocation hint) and once by the validator 
created from the Schema object. You should choose one or the other, 
preferably the JAXP mechanism.

3) You're possibly running into a bug in Java 5 which causes the JDK's 
SchemaFactory to be loaded instead of the one from Xerces. If this is 
occurring you won't get any PSVI. Setting the 
-Djavax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema=org.apache.xerces.jaxp.validation.XMLSchemaFactory
 
system property will select the Xerces implementation.

Thanks.

Michael Glavassevich
XML Parser Development
IBM Toronto Lab
E-mail: [EMAIL PROTECTED]
E-mail: [EMAIL PROTECTED]

"Adil Aijaz" <[EMAIL PROTECTED]> wrote on 10/10/2006 08:40:03 PM:

> Hello there,
> 
> This question is about pulling PSVI information out of xerces SAX 
> Parser. I have the following xml document (a simplified version) 
> returned by call to a web service:
> 
> <diffgr:diffgram xmlns:msdata="urn:schemas
> -microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:
> xml-diffgram-v1"> 
>   <NewDataSet xmlns="">
>     <Table diffgr:id="Table1" msdata:rowOrder="0">
>       <CrawlID>1</CrawlID>
>       <protocol>http://</protocol>
>     </Table> 
>   </NewDataSet>
> </diffgr>
> 
> and the following schema (again simplified version) returned by the 
> same web service:
> 
> <xs:schema id="NewDataSet" xmlns="" xmlns:xs=" http://www.w3.
> org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
>   <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:
> MainDataTable="Table" msdata:UseCurrentLocale="true"> 
>     <xs:complexType>
>       <xs:choice minOccurs="0" maxOccurs="unbounded">
>         <xs:element name="Table">
>           <xs:complexType>
>             <xs:sequence> 
>               <xs:element name="CrawlID" type="xs:int" minOccurs="0"/>
>               <xs:element name="port" type="xs:string" minOccurs="0"/> 
>             </xs:sequence>
>           </xs:complexType>
>         </xs:element>
>       </xs:choice>
>     </xs:complexType>
>   </xs:element>
> </xs:schema>
> 
> I want to be able to pull PSVI information out of the parser when 
> validating the given xml document against the schema using SAX. I 
> define an extension to 
> DefaultHandler class and in the constructor, I initialize the parser as:
> 
> <code>
> ..
> private InputSource _xmlSource;
> private Source _schemaSrc;
> private PSVIProvider _psviProvider; 
> ...
> // inside the constructor: 
> SAXParserFactory factory = SAXParserFactory.newInstance();
> // set features
> factory.setValidating(true);
> factory.setNamespaceAware(true);
> factory.setFeature( http://xml.org/sax/features/namespace-prefixes, 
true);
> factory.setFeature("http://apache.org/xml/features/validation/schema ", 
true);
> factory.setFeature ("http://apache.
> org/xml/features/validation/schema/augment-psvi", true); 
> 
> // set schema
> factory.setSchema(SchemaFactory.newInstance (XMLConstants.
> W3C_XML_SCHEMA_NS_URI).newSchema(_schemaSrc));
> 
> // get the parser and PSVIProvider. 
> SAXParser parser = factory.newSAXParser();
> _psviProvider = (PSVIProvider) parser.getXMLReader(); 
> 
> //  now parse. 
> parser.parse(_xmlSrc, this);
> </code>
> 
> To get the PSVI values, I insert the following code in my endElement
> event handler:
> 
> <code>
> ElementPSVI psvi = _psviProvider.getElementPSVI(); 
> if (psvi != null) {
>      // If there was an element content
>   Object value = psvi.getActualNormalizedValue();
>   short type = psvi.getActualNormalizedValueType();
>   if(value != null) {
>     // do something 
>   }
> }
> </code>
> 
> The problem I face is that value object returned by psvi.
> getActualNormalizedValue() is always NULL. Now, there are a couple 
> of validation errors that are reported for the Table element of the 
> xml, however, that does not stop parsing. The errors have to do with
> the parser not recognizing the attributes of 'Table' element. 
> Moreover, it cannot recognize the root element diffgr:diffgram. I 
> tried stipping out the diffgr:diffgram element and sending the data 
> from NewDataSet onwards, but the root element declaration not found 
> error persists. 
> 
> So, my question is, do you have any pointers as to what am I doing 
> wrong? is there something very wrong with my xml/schema due to which
> the parser cannot obtain this information? I would appreciate any help. 
> 
> I read in some of the posts that the root element validation error 
> happens because the external schema location property is not set. I 
> am not sure how that applies to my case cuz I do not have these 
> documents stored on disk, rather I have string readers generate 
> InputSources that I feed to the parser. 
> 
> Adil

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to