Hi, I'm using Xerces 1.4.1 on RedHat 7.1 on a Pentium with JDK: Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b65) When I attempt to use Schema validation I get parse error: java.lang.NullPointerException java.lang.NullPointerException at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1094) at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1122) at txmlapk.Txmld.<init>(Txmld.java:89) at txmlapk.Txmld.main(Txmld.java:38) My java source and test files are below. How can I get Schema validation running? Many thanks, Steve ===== begin Txmld.java ===== import java.io.IOException; import java.io.StringWriter; import java.util.HashMap; import org.apache.xerces.dom.TextImpl; import org.apache.xerces.parsers.DOMParser; import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.Serializer; import org.apache.xml.serialize.SerializerFactory; import org.apache.xml.serialize.XMLSerializer; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXParseException; import vgenpk.Vgen; import vgenpk.Vobject; public class Txmld implements ErrorHandler { public static void main( String[] args) { new Txmld( args); } void badparms( String msg) { System.out.println("Error: " + msg); System.out.println("args: filename"); System.exit( 1); } public Txmld( String[] args) { Document doc = null; if (args.length != 1) badparms("wrong num parms"); String inuri = args[0]; try { DOMParser parser = new DOMParser(); parser.setFeature( "http://apache.org/xml/features/dom/defer-node-expansion", false); // Validation (must also set error handler): parser.setFeature( "http://xml.org/sax/features/validation", true); parser.setErrorHandler( this); // Namespace parser.setFeature( "http://xml.org/sax/features/namespaces", true); // Schema support parser.setFeature( "http://apache.org/xml/features/validation/schema", true); // Schema full constraint checking parser.setFeature( "http://apache.org/xml/features/validation/schema-full-checking", true); System.out.println("inuri: \"" + inuri + "\""); parser.parse( inuri); doc = parser.getDocument(); } catch (Exception spe) { System.out.println( "parse error: " + spe); spe.printStackTrace(); System.exit(1); } } // end constructor // ErrorHandler interface public void error( SAXParseException exc) { System.out.println("ErrorHandler: error: " + exc); } public void fatalError( SAXParseException exc) { System.out.println("ErrorHandler: fatalError: " + exc); } public void warning( SAXParseException exc) { System.out.println("ErrorHandler: warning: " + exc); } } // end class Txmld ===== end file ===== ===== begin tempa.xml ===== <?xml version="1.0" encoding="UTF-8"?> <personnel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="tempa.xsd"> <person id="Big.Boss" > <name><family>Boss</family> <given>Big</given></name> <email>chief@foo.com</email> <link subordinates="one.worker two.worker three.worker four.worker five.worker"/> </person> <person id="one.worker"> <name><family>Worker</family> <given>One</given></name> <email>one@foo.com</email> <link manager="Big.Boss"/> </person> <person id="two.worker"> <name><family>Worker</family> <given>Two</given></name> <email>two@foo.com</email> <link manager="Big.Boss"/> </person> <person id="three.worker"> <name><family>Worker</family> <given>Three</given></name> <email>three@foo.com</email> <link manager="Big.Boss"/> </person> <person id="four.worker"> <name><family>Worker</family> <given>Four</given></name> <email>four@foo.com</email> <link manager="Big.Boss"/> </person> <person id="five.worker"> <name><family>Worker</family> <given>Five</given></name> <email>five@foo.com</email> <link manager="Big.Boss"/> </person> </personnel> ===== end file ===== ===== begin tempa.xsd ===== <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="personnel"> <xs:complexType> <xs:sequence> <xs:element ref="person" minOccurs='1' maxOccurs='unbounded'/> </xs:sequence> </xs:complexType> <xs:unique name="unique1"> <xs:selector xpath="person"/> <xs:field xpath="@name"/> </xs:unique> <xs:key name='empid'> <xs:selector xpath="person"/> <xs:field xpath="@id"/> </xs:key> <xs:keyref name="keyref1" refer='empid'> <xs:selector xpath="person"/> <xs:field xpath="link/@manager"/> </xs:keyref> </xs:element> <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element ref="name"/> <xs:element ref="email" minOccurs='0' maxOccurs='unbounded'/> <xs:element ref="url" minOccurs='0' maxOccurs='unbounded'/> <xs:element ref="link" minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use='required'/> <xs:attribute name="note" type="xs:string"/> <xs:attribute name="contr" default="false"> <xs:simpleType> <xs:restriction base = "xs:string"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="salary" type="xs:integer"/> </xs:complexType> </xs:element> <xs:element name="name"> <xs:complexType> <xs:all> <xs:element ref="family"/> <xs:element ref="given"/> </xs:all> </xs:complexType> </xs:element> <xs:element name="family" type='xs:string'/> <xs:element name="given" type='xs:string'/> <xs:element name="email" type='xs:string'/> <xs:element name="url"> <xs:complexType> <xs:attribute name="href" type="xs:string" default="http://"/> </xs:complexType> </xs:element> <xs:element name="link"> <xs:complexType> <xs:attribute name="manager" type="xs:IDREF"/> <xs:attribute name="subordinates" type="xs:IDREFS"/> </xs:complexType> </xs:element> <xs:notation name='gif' public='-//APP/Photoshop/4.0' system='photoshop.exe'/> </xs:schema> ===== end file =====
This bug had been fixed in CVS. Go grab the latest version.
I just installed and tested with: xml-xerces_20010709114340.tar.gz The bug still exists: java.lang.NullPointerException at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1094) at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1122) at txmlapk.Txmld.<init>(Txmld.java:89) at txmlapk.Txmld.main(Txmld.java:38)
so your program triggered more than one bug :-) Now it's fixed in CVS. when defer-node-expansion is set to false in DOMParser, fDocumentHandle.characters() should be the last method to call when processing characters and whitespaces. (XMLValidator.java)