Domanda

Ora, ho due classi Java come questo.

public class HogeDomain {

    private User userDomain;

    public HogeDomain() {
    }

         and getter/setter..  
}

public class User {

    public User() {
    }

    private String id;
    private String password;
    private Date userDate;

    and getter/setter..
}

E poi, ho creato uno schema XML qui sopra per l'utilizzo di "Schemagen" di un compito Ant automaticamente.

E 'questo.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="hogeDomain">
    <xs:sequence>
     <xs:element name="userDomain" type="user" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="user">
    <xs:sequence>
      <xs:element name="id" type="xs:string" minOccurs="0"/>
      <xs:element name="password" type="xs:string" minOccurs="0"/>
      <xs:element name="userDate" type="xs:dateTime" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>

Ma voglio davvero creare uno schema XML come questo per utilizzando JAXB smistamento o unmarshalling.

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

      <xs:element name="hogeDomain">
      <xs:complexType>
         <xs:sequence>
           <xs:element ref="userDomain" minOccurs="0"/>
         </xs:sequence>
      </xs:complexType>
      </xs:element>

      <xs:element name="userDomain">
         <xs:complexType>
           <xs:sequence>
              <xs:element name="id" type="xs:string" minOccurs="0"/>
              <xs:element name="password" type="xs:string" minOccurs="0"/>
              <xs:element name="userDate" type="xs:dateTime" minOccurs="0"/>
           </xs:sequence>
         </xs:complexType>
      </xs:element>
 </xs:schema>

Come creare questo schema XML per l'utilizzo di un compito "Schemagen" Ant? Non voglio scrivere uno schema XML per fatti a mano.

E c'è qualche soluzioni quando se no?

È stato utile?

Soluzione

È possibile effettuare le seguenti operazioni:

  1. È necessario aggiungere @XmlRootElement a ciascuno di voi classi per arrivare a causare gli elementi globali da generare.
  2. Sarà necessario aggiungere @XmlType (name = "") per forzare le definizioni di tipo complesso di essere anonimi.
  3. Sarà necessario utilizzare @XmlElementRef sulla proprietà.

Come dimostrato da:

import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement
@XmlType(name="")
public class HogeDomain {

    private User userDomain;

    @XmlElementRef
    public User getUserDomain() {
        return userDomain;
    }

    public void setUserDomain(User userDomain) {
        this.userDomain = userDomain;
    }

}

e

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement
@XmlType(name="")
public class User {

}

Per generare il seguente schema:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="hogeDomain">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="user"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="user">
    <xs:complexType>
      <xs:sequence/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Con il seguente codice:

import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(HogeDomain.class);
        jc.generateSchema(new MySOR());

    }

    private static class MySOR extends SchemaOutputResolver {

        @Override
        public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
            StreamResult result = new StreamResult(System.out);
            result.setSystemId(suggestedFileName);
            return result;
        }

    }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top