Схема XSD для XML с несколькими структурами - PullRequest
2 голосов
/ 11 марта 2010

Я пытаюсь написать схему XML, чтобы охватить ряд условий XML, с которыми я могу столкнуться. У меня один и тот же корневой элемент (serviceRequest) с разными дочерними элементами. Я пытался использовать элемент xs: extension для определения нескольких версий, но он жалуется на неожиданный элемент orderInclusionCriteria и т. Д.

Правильно ли я поступаю, или есть лучший способ определить это?

Другой способ, которым я думал об этом, это иметь один xs: выбор со всеми опциями внутри него, но это казалось несколько не элегантным.

Эти XSD-файлы предназначены для использования в XMLBeans, если это имеет какое-либо значение.

Я дал следующие 2 примера XML:

1)

<?xml version="1.0" encoding="utf-8"?>
<serviceRequest method="GOO" debug="NO">
    <sessionId sID="ABC1234567" />
    <orderInclusionCriteria accountId="1234567" accountNum="1234567890" />
</serviceRequest>

2)

<?xml version="1.0" encoding="utf-8"?>
<serviceRequest method="GOO" debug="NO">
    <sessionId sID="ABC1234567" />
    <action aType='MakePayment'>
        <makePayment accountID='CH91015165S' amount='5.00' />
    </action>
</serviceRequest>

Я подумал, что мог бы использовать следующий файл схемы:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="serviceRequest" type="ServiceRequestType" />
    <xs:element name="session" type="SessionType" />

    <xs:attribute name="method" type="xs:string" />
    <xs:attribute name="debug" type="xs:string" />

    <xs:complexType name="SessionType">
        <xs:attribute name="sID" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:string"/>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="ServiceRequestType">
        <xs:sequence>
            <xs:element ref="session" />
        </xs:sequence>
        <xs:attribute ref="method" />
        <xs:attribute ref="debug" />        
    </xs:complexType>

    <xs:complexType name="OrderTrackingServiceRequest">
        <xs:complexContent>
            <xs:extension base="ServiceRequestType">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="OrderInclusionCriteria" type="xs:string" />
                    </xs:sequence>
                </xs:complexType>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Action">
        <xs:complexContent>
            <xs:extension base="ServiceRequestType">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="makePayment">
                            <xs:complexType>
                                <xs:attribute name="accountID" type="xs:string" />
                                <xs:attribute name="amount" type="xs:string" />
                            <xs:complexType>
                        </xs:element>
                    </xs:sequence>
                    <xs:attribute name="aType" type="xs:string" />
                </xs:complexType>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Поможет ли элемент <xs:choice>: http://www.w3schools.com/Schema/el_choice.asp

Дайте мне знать, если это так, и если вы хотите полный пример.

0 голосов
/ 12 марта 2010

попробуйте использовать minOccurs = "0" для элементов, которые вы не хотите присутствовать. Я думаю, что таким образом вы можете решить свою проблему с версиями. Также xs: choice может работать в вашем случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...