XML-схему, созданную задачей «Schemagen» Ant, можно больше настраивать? - PullRequest
2 голосов
/ 17 января 2011

Теперь у меня есть два Java-класса, подобных этому.

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..
}

И затем я создал схему XML выше для автоматического использования "Schemagen" задачи Ant.

Это так.

<?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>

Но я действительно хочу создать XML-схему, подобную этой, с использованием JAXB-маршалинга или демаршаллинга.

  <?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>

Как создать эту XML-схему для использования муравья "Schemagen"задача?Я не хочу писать XML-схему для рукоделия.

И есть ли решения, если это невозможно?

1 Ответ

1 голос
/ 17 января 2011

Вы можете сделать следующее:

  1. Вам потребуется добавить @XmlRootElement к каждому из ваших классов, чтобы получить возможность генерировать глобальные элементы.
  2. Вам потребуетсядобавьте @XmlType (name = ""), чтобы определения сложного типа были анонимными.
  3. Вам необходимо использовать @XmlElementRef для свойства.

Как продемонстрировано:

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;
    }

}

и

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

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

}

Для создания следующей схемы:

<?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>

со следующим кодом:

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;
        }

    }

}
...