如何将xsd:choice的xsd:elements组合在一起并外包它们?
我正在使用XSD,我有一个XSD:choice,其中包含许多XSD:element。现在我想稍微简化一下,因此我对xsd:elements进行了分组,以便可以将它们外包(并重用)到单独的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
<!-- 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的博客,它应该有助于理解你的解决方案,或者至少有助于更好地阐述你的问题
现在问题澄清了一点。这是我的问题,我不知道如何(准确地)做到这一点。不幸的是,如果您想很好地“整理”元素组,我不知道不创建新类的方法。如果您使用的是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;
}
}