I've committed the testcase here
http://anonsvn.jboss.org/repos/common/jbossxb/trunk/src/test/java/org/jbo...
and the xml and xsd are here
http://anonsvn.jboss.org/repos/common/jbossxb/trunk/src/test/resources/or...
As mentioned above, the problem is the XML parser cannot resolve the XSD.
addSchemaLocation(XMLNS_BLUEPRINT, "blueprint.xsd"); won't help. This will
configure XsdBinder to resolve schema to class mapping (i.e. this is binding layer) but it
has nothing to do with the XML parser.
So, here is the testcase I committed
UnmarshallerFactory unmarshallerFactory = UnmarshallerFactory.newInstance();
| Unmarshaller unmarshaller = unmarshallerFactory.newUnmarshaller();
|
| // this is to make the SAX parser parse the XSD as well and include default
attribute values in the startElement
| unmarshaller.setSchemaValidation(true);
|
| // this is EntityResolver that SAX parser (xerces) will use to resolve XSD
location for the XML being parsed
| JBossEntityResolver xmlResolver = new JBossEntityResolver();
| // Here we map schema location specified in the XML file to the local schema
location,
| // which is a path relative to the resources directory visible in the
classpath.
| // Note, we have to specify here and XML the complete URL including the protocol
part into the schemaLocation.
| // The reason is that if we specify schemaLocation in XML as just a filename,
| // the SAX parser will compose its schemaLocation by adding the protocol,
baseURI (which will depend on the
| // environment the code is run in) and the schemaLocation we specified in the
XML and then
| // will pass this new schemaLocation to the resolver.
|
xmlResolver.registerLocalEntity("http://www.hostame.org/SchemaDefaul...;,
"org/jboss/test/xb/builder/object/attribute/test/SchemaDefaultAttributeValue.xsd");
| unmarshaller.setEntityResolver(xmlResolver);
|
| // this is to resolve namespace to class mapping and build the SchemaBinding
from the class
| MultiClassSchemaResolver schemaBindingResolver = new
MultiClassSchemaResolver();
| schemaBindingResolver.mapURIToClass("xb:test:default-attribute",
DefaultAttribute.class);
| // the reason we configured a separate EntityResolver for unmarshaller above
instead of
| // calling schemaBindingResolver.mapSchemaLocation(nsURI, location) is that
| // entity resolution inside schemaBindingResolver is used only for nsURI to
class resolution (by XsdBinder)
| // and is not related to SAX parser entity resolution and XML validation.
|
| String xml = findXML("SchemaDefaultAttributeValue.xml");
| Object result = unmarshaller.unmarshal(xml, schemaBindingResolver);
XSD
<xsd:schema
| targetNamespace="xb:test:default-attribute"
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
| elementFormDefault="qualified"
| attributeFormDefault="unqualified">
|
| <xsd:element name="default-attribute">
| <xsd:complexType>
| <xsd:attribute name="attribute" type="xsd:int"
default="123" />
| </xsd:complexType>
| </xsd:element>
| </xsd:schema>
XML
<default-attribute xmlns="xb:test:default-attribute"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| xsi:schemaLocation="xb:test:default-attribute
http://www.hostame.org/SchemaDefaultAttributeValue.xsd"/>
I agree, XSD resolution and its configuration is confusing. That's something we could
work on and make simpler.
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4241616#...
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&a...