This is EXACTLY the problem I am having. It works find if you declare the element as anytype in the XSD, but it does NOT work if you declare it as a specific type and then subtype from that.
Vinh Nguyen (vinguye2) wrote: > > Hi, > Instead of just getting the extending type's class, is there a way to > actually get an instance of that type? For example, the following will > not work: > > TestType test = TestDocument.Factory.newTest(); > test.getTypeExtensions().addNewExtension( testTypeClientExtension ); > > TestTypeClientExtension ext = > (TestTypeClientExtension)test.getTypeExtensions().getExtension(0); // > ClassCastException! > > So even if you insert an extending type, the composite object will only > return a new instance of the base type. It doesn't even return the > actual object that was inserted. Hencing, casting will not work. > > There seems to be a disjoint in the extension pattern allowed in XML > schemas versus how XmlBeans implements the corresponding Java class > extension pattern. > > > > > -----Original Message----- > From: Cory Virok [mailto:[EMAIL PROTECTED] > Sent: Thursday, November 15, 2007 8:05 AM > To: user@xmlbeans.apache.org > Subject: RE: type and Java Class > > I've done the same thing. Basically, you need to get the SchemaParticle > that corresponds to the XmlObject's schema type, then get the Type of > that schema particle and finally, get the java class associated with > that type, (via > getJavaClass().) > > I haven't actually tried this code so my apologies if it doesn't work... > XmlObject testTypeExtension = > test.getTest().getTypeExtensions().getExtensionArray()[0]; > > SchemaType testExtType = testTypeExtension.schemaType(); > Class testExtClass = testExtType.getJavaClass(); //the Class > you're > interested in > > Hope it helps/works! > cory > > -----Original Message----- > From: cmoller [mailto:[EMAIL PROTECTED] > Sent: Wednesday, November 14, 2007 11:05 AM > To: user@xmlbeans.apache.org > Subject: xsi:type and Java Class > > > I am having trouble getting XmlBeans 1.0.4 to return the Java class I > want > from an XML document. The XSD defines a complex type containing a list > of an > abstract type. In another namespace I am defining a concrete extension > of > the abstract type. When I parse an xml document containing on of these > lists, it returns references to the abstract type's class, not the > concrete > type. If I change the list to a list of anyType instead of the abstract > type, I get back the expected class. Here are my XSD's: > > <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > targetNamespace="http://domain/test" > xmlns:test="http://domain/test" > elementFormDefault="qualified"> > <xsd:complexType name="testType"> > <xsd:sequence> > <xsd:element name="typeExtensions" minOccurs="0" > type="test:testTypeExtensions"/> > </xsd:sequence> > </xsd:complexType> > <xsd:complexType name="testTypeExtensions"> > <xsd:sequence> > <!--<xsd:element name="extension" > type="test:testTypeExtension" > maxOccurs="unbounded" minOccurs="0"></xsd:element>--> > <xsd:element name="extension" type="xsd:anyType" > maxOccurs="unbounded" minOccurs="0"></xsd:element> > </xsd:sequence> > </xsd:complexType> > <xsd:complexType name="testTypeExtension" abstract="true"> > <xsd:sequence/> > </xsd:complexType> > <xsd:element name="test" type="test:testType"/> > </xsd:schema> > > ****XSD #2************************************** > > <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > targetNamespace="http://domain/test/ext" > xmlns:test="http://domain/test" > elementFormDefault="qualified"> > <xsd:import namespace="http://domain/test" > schemaLocation="test.xsd"></xsd:import> > <xsd:complexType name="testTypeClientExtension"> > <xsd:complexContent> > <xsd:extension base="test:testTypeExtension"> > <xsd:sequence> > <xsd:element name="extensionElement" > type="xsd:string"></xsd:element> > </xsd:sequence> > </xsd:extension> > </xsd:complexContent> > </xsd:complexType> > </xsd:schema> > > **** JAVA CODE ****************** > > Here is the Java code that I am using to check the behavior. > > String xmlText = "<test:test xmlns:test=\"http://domain/test\" > xmlns:ext=\"http://domain/test/ext\" > xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><test:typeExtens > ions> > <test:extension > xsi:type=\"ext:testTypeClientExtension\"/></test:typeExtensions></test:t > est>" > ; > > TestDocument test = (TestDocument) > XmlObject.Factory.parse(xmlText); > XmlObject testTypeExtension = > test.getTest().getTypeExtensions().getExtensionArray()[0]; > > System.out.println("testTypeClientExtension.getClass().getName() > - " > + testTypeExtension.getClass().getName()); > > If I use anyType in the list in the xsd, the system out will display > TestTypeClientExtension as the class. If I use TestTypeExtension, it > will > display TestTypeExtension. I want to get back an instance of the class > based > on the xsi:type. > > Thanks in advance for any help. > -- > View this message in context: > http://www.nabble.com/xsi%3Atype-and-Java-Class-tf4807282.html#a13754000 > Sent from the Xml Beans - User mailing list archive at Nabble.com. > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > -- View this message in context: http://www.nabble.com/xsi%3Atype-and-Java-Class-tf4807282.html#a13984806 Sent from the Xml Beans - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]