как сгруппировать xsd: элементы xsd: choice вместе и передать их на аутсорсинг? - PullRequest
0 голосов
/ 07 декабря 2011

Я работаю с XSD, и у меня есть xsd: выбор со многими элементами xsd: Теперь я хочу немного упростить его, и поэтому я сгруппировал элементы xsd:, чтобы я мог передавать их (и повторно использовать) в отдельные элементы xsd: *. 1001 *

До:

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

К сожалению, это создает новые классы 'login' и 'contact' при генерации из него Java-Source, чего я хочу избежать. Есть ли способ передать сгруппированные элементы xsd: для упрощения выбора xsd:

1 Ответ

2 голосов
/ 07 декабря 2011

Я не уверен, что именно вы ищете, но это должно быть одно из следующего:

  • вы либо хотите упростить имя сгенерированного поля, чтобы вместо n1n2n3 выполучить что-то более читаемое;в этом случае я предлагаю пойти с этим решением, представленным здесь
  • Я предлагаю вам прочитать блог Блейза здесь и здесь - это должно помочьпонять свое решение или, по крайней мере, как лучше сформулировать свой вопрос.

ОБНОВЛЕНИЕ: Хорошо, вам нужно обернуть эти две группы элементов xsd: sequence xsd: sequence и затем поиграть сфайл привязок, чтобы получить то, что вы хотите (я полагаю, вы используете JAXB).

ОБНОВЛЕНИЕ 2: Так что, похоже, вы используете JAXB.Затем, если вы возьмете схему ниже, я думаю, что она даст вам то, что вы хотите, повторно использовать (путем ссылки на группы моделей) и не будет новых классов.Я опубликую оба артефакта, но я предлагаю вам также попробовать (я использовал NetBeans), чтобы посмотреть, что происходит (также написать тестовый клиент на Java, который использует класс, посмотреть, что увидит разработчик и т. Д.) Иесли это не то, что вам нужно, используйте результаты вашей попытки, чтобы проиллюстрировать еще один ваш вопрос.

XSD:

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

Java Generated class (по умолчанию, никаких пользовательских привязок удаленонерелевантное содержание):

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