O
Olaf Meyer
Apprentently xerces 2.6.0 (Java) does not validate against contraints
specified in the schema (e.g. constraints specified via unique element).
The validation works with the XML editor I'm using (XMLSpy4) but not
with Xerces 2.6.0.
I've included a really short and simple example to illustrate it. I
would like to get some comments on the validation capabilities of Xerces
2.6.0. I though it *fully* supported W3C Schema!
Here's the XML file:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.mynames.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mynames.org
x:/work/sjrodc/xml/constraint.xsd">
<object id="1"/>
<!-- Here's the uniqueness violation -->
<object id="1"/>
</root>
Here's the Schema file. It defines a uniqueness constraint on the
object's 'id' attribute.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.mynames.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.mynames.org" elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="object" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="objectId">
<xs:selector xpath=".//object"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
</xs:schema>
And here's the Java code that does the parsing:
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class XmlValidationTest
{
public static String SCHEMA_LANGUAGE =
"http://java.sun.com/xml/jaxp/properties/schemaLanguage";
public static String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
public static String SCHEMA_SOURCE =
"http://java.sun.com/xml/jaxp/properties/schemaSource";
public static final void main( String[] args )
throws IOException, SAXException, ParserConfigurationException
{
if( args.length < 2 )
{
System.err.println( "usage is:" );
System.err.println( " <xml file> <schema file>" );
return;
}
File input = new File( args[0] );
File schema = new File( args[1] );
SAXParserFactory factory = SAXParserFactory.newInstance( );
factory.setNamespaceAware( true );
factory.setValidating( true );
SAXParser parser = factory.newSAXParser( );
try
{
parser.setProperty( SCHEMA_LANGUAGE, XML_SCHEMA );
parser.setProperty( SCHEMA_SOURCE, schema );
}
catch( SAXNotRecognizedException x )
{
System.err.println( "Your SAX parser is not JAXP 1.2
compliant." );
}
System.out.println( "Parsing '" + args[0] +
"' against W3C schema '" +
args[1] + "' ..." );
parser.parse( input, new ErrorPrinter( ) );
System.out.println( "Done." );
}
static class ErrorPrinter
extends DefaultHandler
{
private MessageFormat message =
new MessageFormat( "({0}: {1}, {2}): {3}" );
private void print( SAXParseException x )
{
String msg =
message.format( new Object[]
{
x.getSystemId( ),
new Integer( x.getLineNumber( ) ),
new Integer( x.getColumnNumber( ) ),
x.getMessage( )
} );
System.out.println( msg );
}
public void warning( SAXParseException x )
{
print( x );
}
public void error( SAXParseException x )
{
print( x );
}
public void fatalError( SAXParseException x )
throws SAXParseException
{
print( x );
throw x;
}
}
}
specified in the schema (e.g. constraints specified via unique element).
The validation works with the XML editor I'm using (XMLSpy4) but not
with Xerces 2.6.0.
I've included a really short and simple example to illustrate it. I
would like to get some comments on the validation capabilities of Xerces
2.6.0. I though it *fully* supported W3C Schema!
Here's the XML file:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.mynames.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mynames.org
x:/work/sjrodc/xml/constraint.xsd">
<object id="1"/>
<!-- Here's the uniqueness violation -->
<object id="1"/>
</root>
Here's the Schema file. It defines a uniqueness constraint on the
object's 'id' attribute.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.mynames.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.mynames.org" elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="object" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="objectId">
<xs:selector xpath=".//object"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
</xs:schema>
And here's the Java code that does the parsing:
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class XmlValidationTest
{
public static String SCHEMA_LANGUAGE =
"http://java.sun.com/xml/jaxp/properties/schemaLanguage";
public static String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
public static String SCHEMA_SOURCE =
"http://java.sun.com/xml/jaxp/properties/schemaSource";
public static final void main( String[] args )
throws IOException, SAXException, ParserConfigurationException
{
if( args.length < 2 )
{
System.err.println( "usage is:" );
System.err.println( " <xml file> <schema file>" );
return;
}
File input = new File( args[0] );
File schema = new File( args[1] );
SAXParserFactory factory = SAXParserFactory.newInstance( );
factory.setNamespaceAware( true );
factory.setValidating( true );
SAXParser parser = factory.newSAXParser( );
try
{
parser.setProperty( SCHEMA_LANGUAGE, XML_SCHEMA );
parser.setProperty( SCHEMA_SOURCE, schema );
}
catch( SAXNotRecognizedException x )
{
System.err.println( "Your SAX parser is not JAXP 1.2
compliant." );
}
System.out.println( "Parsing '" + args[0] +
"' against W3C schema '" +
args[1] + "' ..." );
parser.parse( input, new ErrorPrinter( ) );
System.out.println( "Done." );
}
static class ErrorPrinter
extends DefaultHandler
{
private MessageFormat message =
new MessageFormat( "({0}: {1}, {2}): {3}" );
private void print( SAXParseException x )
{
String msg =
message.format( new Object[]
{
x.getSystemId( ),
new Integer( x.getLineNumber( ) ),
new Integer( x.getColumnNumber( ) ),
x.getMessage( )
} );
System.out.println( msg );
}
public void warning( SAXParseException x )
{
print( x );
}
public void error( SAXParseException x )
{
print( x );
}
public void fatalError( SAXParseException x )
throws SAXParseException
{
print( x );
throw x;
}
}
}