Element is not bound as a global element.
thomas.diesler Nov 26, 2009 7:36 AMI 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?