Ant “创建的xml架构”;Schemagen“;蚂蚁的任务可以定制更多吗?

Ant “创建的xml架构”;Schemagen“;蚂蚁的任务可以定制更多吗?,ant,xsd,jaxb,schemagen,Ant,Xsd,Jaxb,Schemagen,现在,我有两个这样的Java类 public class HogeDomain { private User userDomain; public HogeDomain() { } and getter/setter.. } public class User { public User() { } private String id; private String password; privat

现在,我有两个这样的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模式,用于自动使用Ant任务的“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编组或解编组

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

如何使用“Schemagen”Ant任务创建此xml模式? 我不想为手工制作的文档编写xml模式


如果不能,有什么解决方案吗?

您可以执行以下操作:

  • 您需要将@XmlRootElement添加到每个类中,以生成全局元素
  • 您需要添加@XmlType(name=”“)以强制复杂类型定义为匿名
  • 您需要在属性上使用@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;
        }
    
    }
    

    要生成以下架构:

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

    谢谢布莱斯!有没有其他方法可以不用在Java类中进行注释来完成?我希望尽可能不使用注释来完成这项工作……您是否已在EclipseLink JAXB(MOXy)中签出XML映射文件:
    <?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;
            }
    
        }
    
    }