如何将xsd:choice的xsd:elements组合在一起并外包它们?

如何将xsd:choice的xsd:elements组合在一起并外包它们?,xsd,jaxb,Xsd,Jaxb,我正在使用XSD,我有一个XSD:choice,其中包含许多XSD:element。现在我想稍微简化一下,因此我对xsd:elements进行了分组,以便可以将它们外包(并重用)到单独的xsd:elements中 之前: <!-- main.xsd --> <xsd:element name="account"> <xsd:complexType> <xsd:choice> <xsd:eleme

我正在使用XSD,我有一个XSD:choice,其中包含许多XSD:element。现在我想稍微简化一下,因此我对xsd:elements进行了分组,以便可以将它们外包(并重用)到单独的xsd:elements中

之前:

<!-- main.xsd -->
<xsd:element name="account">
    <xsd:complexType>
        <xsd:choice>
            <xsd:element name="login-id" type="xsd:string" />
            <xsd:element name="login-username" type="xsd:string" />
            <xsd:element name="login-password" type="xsd:string" />
            <xsd:element name="login-note" type="xsd:string" />

            <xsd:element name="contact-name" type="xsd:string" />
            <xsd:element name="contact-address" type="xsd:string" />
            <xsd:element name="contact-phone" type="xsd:string" />
            <xsd:element name="contact-note" type="xsd:string" />
        </xsd:choice>
    </xsd:complexType>
</xsd:element>

之后:

<!-- main.xsd -->
<xsd:include schemaLocation="outsourced.xsd" />

<xsd:element name="account">
    <xsd:complexType>
       <xsd:choice>
           <xsd:element ref="login" />

           <xsd:element ref="contact" />
        </xsd:choice>
    </xsd:complexType>
</xsd:element>

<!-- outsourced.xsd -->
<xsd:element name="login">
    <xsd:complexType>
        <xsd:choice>
            <xsd:element name="login-id" type="xsd:string" />
            <xsd:element name="login-username" type="xsd:string" />
            <xsd:element name="login-password" type="xsd:string" />
            <xsd:element name="login-note" type="xsd:string" />
        </xsd:choice>
    </xsd:complexType>
</xsd:element>

<xsd:element name="contact">
    <xsd:complexType>
        <xsd:choice>
            <xsd:element name="contact-name" type="xsd:string" />
            <xsd:element name="contact-address" type="xsd:string" />
            <xsd:element name="contact-phone" type="xsd:string" />
            <xsd:element name="contact-note" type="xsd:string" />
        </xsd:choice>
    </xsd:complexType>
</xsd:element>


不幸的是,在从中生成Java源代码时,这会创建一个新类“login”和“contact”,这是我想要避免的。有没有办法将分组的xsd:element外包以简化xsd:choice?

我不确定您到底在寻找什么,但它应该是以下之一:

  • 您或者希望简化生成字段的名称,以便获得更可读的内容,而不是n1n2n3;在这种情况下,我建议和你一起去
  • 我建议你阅读Blaise的博客,它应该有助于理解你的解决方案,或者至少有助于更好地阐述你的问题
UPDATE:Ok,您需要做的是用xsd:sequence包装这两组xsd:elements,然后使用绑定文件来获得您想要的(我假设您使用的是JAXB)

更新2:听起来您正在使用JAXB。然后,如果您采用下面的模式,我相信它提供了您想要的,重用(通过引用模型组)并且没有新的类。我将发布这两个工件,但我建议您也尝试一下(我使用了NetBeans)看看发生了什么(还可以用Java编写一个使用该类的测试客户机,看看开发人员会看到什么,等等),如果它仍然不是您想要的,请使用您尝试的结果来进一步说明您的问题

XSD:


现在问题澄清了一点。这是我的问题,我不知道如何(准确地)做到这一点。不幸的是,如果您想很好地“整理”元素组,我不知道不创建新类的方法。如果您使用的是JAXB,则需要一个自定义绑定文件。原则上,我希望这样做,而不是创建包装器元素,因为这样可以使XML结构更平坦……我的xsd相当大,因此这可能会导致一个难以维护的巨大绑定文件。我的理论对吗?非常感谢。你的更新2正是我想要的。
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="account">
        <xsd:complexType>
            <xsd:choice>
                <xsd:group ref="login"/>
                <xsd:group ref="contact"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>

    <xsd:group name="login">
        <xsd:sequence>
            <xsd:element name="login-id" type="xsd:string"/>
            <xsd:element name="login-username" type="xsd:string"/>
            <xsd:element name="login-password" type="xsd:string"/>
            <xsd:element name="login-note" type="xsd:string"/>
        </xsd:sequence>

    </xsd:group>

    <xsd:group name="contact">
        <xsd:sequence>
            <xsd:element name="contact-name" type="xsd:string"/>
            <xsd:element name="contact-address" type="xsd:string"/>
            <xsd:element name="contact-phone" type="xsd:string"/>
            <xsd:element name="contact-note" type="xsd:string"/>
        </xsd:sequence>
    </xsd:group>
</xsd:schema>
package sequnderchoice;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "loginId",
    "loginUsername",
    "loginPassword",
    "loginNote",
    "contactName",
    "contactAddress",
    "contactPhone",
    "contactNote"
})
@XmlRootElement(name = "account")
public class Account {

    @XmlElement(name = "login-id")
    protected String loginId;
    @XmlElement(name = "login-username")
    protected String loginUsername;
    @XmlElement(name = "login-password")
    protected String loginPassword;
    @XmlElement(name = "login-note")
    protected String loginNote;
    @XmlElement(name = "contact-name")
    protected String contactName;
    @XmlElement(name = "contact-address")
    protected String contactAddress;
    @XmlElement(name = "contact-phone")
    protected String contactPhone;
    @XmlElement(name = "contact-note")
    protected String contactNote;

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String value) {
        this.loginId = value;
    }

    public String getLoginUsername() {
        return loginUsername;
    }

    public void setLoginUsername(String value) {
        this.loginUsername = value;
    }

    public String getLoginPassword() {
        return loginPassword;
    }

    public void setLoginPassword(String value) {
        this.loginPassword = value;
    }

    public String getLoginNote() {
        return loginNote;
    }

    public void setLoginNote(String value) {
        this.loginNote = value;
    }

    public String getContactName() {
        return contactName;
    }

    public void setContactName(String value) {
        this.contactName = value;
    }

    public String getContactAddress() {
        return contactAddress;
    }

    public void setContactAddress(String value) {
        this.contactAddress = value;
    }

    public String getContactPhone() {
        return contactPhone;
    }

    public void setContactPhone(String value) {
        this.contactPhone = value;
    }

    public String getContactNote() {
        return contactNote;
    }

    public void setContactNote(String value) {
        this.contactNote = value;
    }        
}