1
@XmlRootElement
public class OtherClass {
    @XmlAttribute
    private String other;
}
@XmlRootElement
public class Simple extends OtherClass {
    @XmlAttribute
    private String id;
    @XmlValue
    public String contents;
}

JAXBContext context = JAXBContext.newInstance(OtherClass.class,Simple.class);
System.out.println(context);
System.out.println("org.eclipse.persistence.Version:"+Version.getVersionString());
context.generateSchema(new MySchemaOutputResolver());
System.out.println(sw);

woxy で生成された XSD 結果を使用する

org.eclipse.persistence.jaxb.JAXBContext@1292d26
org.eclipse.persistence.Version:2.5.0.v20130425-368d603
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:complexType name="otherClass">
      <xsd:sequence/>
      <xsd:attribute name="other" type="xsd:string"/>
   </xsd:complexType>
   <xsd:complexType name="simple">
      <xsd:simpleContent>
         <xsd:extension base="xsd:string">
            <xsd:attribute name="id" type="xsd:string"/> 
         </xsd:extension>
      </xsd:simpleContent>
   </xsd:complexType>
   <xsd:element name="otherClass" type="otherClass"/>
   <xsd:element name="simple" type="simple"/>
</xsd:schema>

sample/other xsd には継承がないが、Java にはある

すみません、問題を解決するには?ここでまずお礼を言います

4

1 に答える 1

0

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

マッピングの意味

MOXy を JAXB プロバイダーとして使用すると ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.htmlを参照)、次のコードを使用できます。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Simple.class, OtherClass.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum18029865/input.xml");
        Simple simple = (Simple) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(simple, System.out);
    }

}

次の XML を Java オブジェクトとの間で変換するには:

<?xml version="1.0" encoding="UTF-8"?>
<simple id="foo" other="bar">Hello World</simple>

マッピングと XML スキーマとの関係

マッピングしたクラスには、XML スキーマでの実際の表現がありません。@XmlValue注釈を使用したため、結果の型は拡張されxsd:stringますが、対応する複合型を拡張する必要があることも示されていますOtherClass


JAXB 参照実装の機能

まったく同じマッピングの場合、JAXB RI は、JAXBContext. この表現は XML スキーマで許可されていないため、マッピングで許可しないことにしました。私は、まだマッピングをサポートしている MOXy で選択したオプションを好みます。

Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
@XmlValue is not allowed on a class that derives another class.
    this problem is related to the following location:
        at public java.lang.String forum18029865.Simple.contents
        at forum18029865.Simple

    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:432)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at forum18029865.Demo.main(Demo.java:9)
于 2013-08-03T13:30:03.730 に答える