理解&为WSDL-first WS准备架构中的Schema

时间:2012-02-17 10:25:43

标签: xml xsd wsdl

我正在创建一个WSDL-first WS,在我创建WSDL之前,我正在手工制作Schema。这是我第一次从头开始创建XSD和WSDL,所以请原谅我的无知/不良做法。客户端将是.NET和服务器Java。

我首先创建两个webservices:一个列出所有类,一个用于检索一个类,以及该类中的所有学生。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="classList">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="class" type="Class" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="class">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="class" type="Class"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="Class">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="id" type="xs:int"/>
            <xs:element name="students" type="StudentList" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="StudentList">
        <xs:sequence>
            <xs:element name="student" type="Student" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Student">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

上述架构是否有意义?如果我生成一些样本,我会得到以下元素classList:

<classList>
    <class>
        <name>String</name>
        <id>0</id>
    </class>
    <class>
        <name>String</name>
        <id>0</id>
    </class>
</classList>

如果需要,我可以选择将学生添加到classList。但这可能不会完成。这对于元素类:

<class>
    <class>
        <name>String</name>
        <id>0</id>
        <students>
            <student>
                <name>String</name>
                <address>String</address>
            </student>
            <student>
                <name>String</name>
                <address>String</address>
            </student>
        </students>
    </class>
</class>

我对类/类命名并不满意。由于我正在为WSDL设计,该元素应该是类似classListResponse和classResponse吗?

我将实体创建为complexTypes而不是元素是一种好习惯吗?然后创建一个容器元素来保存这些实体?

1 个答案:

答案 0 :(得分:0)

你的问题的某些方面涉及风格问题,根据定义,它是蒸汽讨论的主要成分......一种方法是通过查找可能(或可能不)与您的相关的其他信息标准来形成个人意见建模领域。在我的世界中,人们使用Rq / Rs或Request / Response作为后缀来显示以root身份显示的元素,或者使用SOAP:Body元素。还有其他标准,请求没有后缀(例如 Operation ),并且仅对响应元素使用“Response”后缀(OperationResponse)。

至于XSD的创作风格,请查看this one等文章。对于WSDL样式,WS-I 参考书。

如果您的模式体不那么大,并且不使用高级功能,那么我会坚持使用Venetian Blind风格,其中所有类型都是全局的,只有需要从WSDL消息部分引用的元素是全局的(输入/输出和故障)。在WSDL文档/文字中使用元素引用。这应该可以保证你顺利航行。

如果您构建“数据”服务,我会考虑的另一件事是提出一组描述您的域名的名词(您的实体),以及一组用于预期行动的“动词”(一些开始)使用基本的CRUD,然后添加特定于您的域的任何其他内容,例如取消可以是一个......);然后使用Noun + Verb + Suffix(Rq / Rs)一致地汇编顶级元素标签名称。

无论如何,总是投入设置一个简单的命名约定,它将有助于你的建模很多!...