3 Replies Latest reply: Nov 28, 2009 3:00 AM by Thomas Diesler RSS

Element is not bound as a global element.

Thomas Diesler Master

I have a schema like this

<xsd:schema xmlns="http://org.jboss.test.osgi.jbossxb.simple"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://org.jboss.test.osgi.jbossxb.simple"
 elementFormDefault="qualified" attributeFormDefault="unqualified"
 version="1.0.0">

 <xsd:element name="booking" type="courseBooking" />
 <xsd:complexType name="courseBooking">
 <xsd:sequence>
 <xsd:element ref="company" />
 <xsd:element ref="student" minOccurs="1" maxOccurs="unbounded" />
 </xsd:sequence>
 <xsd:attribute name="courseReference" type="xsd:string" use="required" />
 <xsd:attribute name="courseDate" type="xsd:date" use="required" />
 <xsd:attribute name="invoiceReference" type="xsd:string" use="required" />
 <xsd:attribute name="totalPrice" type="xsd:decimal" use="required" />
 </xsd:complexType>
 <xsd:element name="student" type="studentType" />
 <xsd:complexType name="studentType">
 <xsd:attribute name="firstName" type="xsd:string" use="required" />
 <xsd:attribute name="surname" type="xsd:string" use="required" />
 </xsd:complexType>
 <xsd:element name="company" type="companyType" />
 <xsd:complexType name="companyType">
 <xsd:sequence>
 <xsd:element name="address" />
 <xsd:element ref="contact" />
 </xsd:sequence>
 <xsd:attribute name="name" type="xsd:string" />
 </xsd:complexType>
 <xsd:element name="contact" type="contactType" />
 <xsd:complexType name="contactType">
 <xsd:attribute name="name" type="xsd:string" use="required" />
 <xsd:attribute name="telephone" type="xsd:string" use="required" />
 <xsd:attribute name="email" type="xsd:string" use="required" />
 </xsd:complexType>
</xsd:schema>


and an xml like this

<booking xmlns="http://org.jboss.test.osgi.jbossxb.simple" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <company name="ACME Consulting">
 <address>10 Coyote Avenue, Arizona, USA</address>
 <contact name="Duke" email="duke@acme.com" telephone="1234567890" />
 </company>
 <student firstName="Jane" surname="Dow" />
 <student firstName="John" surname="Doe" />
</booking>


using this code

 Unmarshaller unmarshaller = UnmarshallerFactory.newInstance().newUnmarshaller();
 unmarshaller.setSchemaValidation(true);
 unmarshaller.setNamespaceAware(true);
 unmarshaller.setValidation(true);

 URL xsdurl = getResourceURL("simple/booking.xsd");
 assertNotNull("booking.xsd available", xsdurl);

 URL xmlurl = getResourceURL("simple/booking.xml");
 assertNotNull("booking.xml available", xmlurl);

 JBossEntityResolver entityResolver = new JBossEntityResolver();
 entityResolver.registerLocalEntity(CourseBooking.NAMESPACE_XML_SIMPLE, xsdurl.toExternalForm());
 unmarshaller.setEntityResolver(entityResolver);

 DefaultSchemaResolver schemaBindingResolver = new DefaultSchemaResolver();
 schemaBindingResolver.addClassBinding(CourseBooking.NAMESPACE_XML_SIMPLE, CourseBooking.class);

 CourseBooking booking = (CourseBooking)unmarshaller.unmarshal(xmlurl.toExternalForm(), schemaBindingResolver);
 assertNotNull("booking not null", booking);


I get

Caused by: org.jboss.xb.binding.JBossXBRuntimeException: Element {http://org.jboss.test.osgi.jbossxb.simple}booking is not bound as a global element.
 at org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.startElement(SundayContentHandler.java:641)
 at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$DelegatingContentHandler.startElement(SaxJBossXBParser.java:401)
 at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
 at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)


I debugged into SundayContentHandler and found that SchemaBinding

 public ParticleBinding getElementParticle(QName name)
 {
 return elements.get(name);
 }


has element "course-booking" registered instead of "booking"

If I change the schema and xml to use course-booking, all works fine.

Why is "booking' not registered?