现在,我有两个这样的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”。

就是这样。

<?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编组或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>

如何创建此XML模式用于使用“ schemagen”蚂蚁任务?我不想写XML模式进行手工制作。

如果不能,是否有任何解决方案?

有帮助吗?

解决方案

您可以执行以下操作:

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

    }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top