如何在XSD Schema中添加以逗号分隔的String值为单位的元素

时间:2014-05-30 19:26:01

标签: soap wsdl xsd

我是XML架构的新手...... 我有一个xsd架构文件: -

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.anirban.com/v1"
    xmlns:tns="http://www.anirban.com/v1" elementFormDefault="qualified">

    <complexType name="InputRequest">
        <sequence>
            <element name="Name" maxOccurs="unbounded" type="string">
            </element>
            <element name="Url" type="anyURI" maxOccurs="1" minOccurs="0">
            </element>

            <element name="Employee">
                <complexType>
                    <sequence>
                        <element name="VehicleList" maxOccurs="unbounded" type="string" />
                        <element name="EmployeeName" type="string" default="Anirban" />

                    </sequence>
                </complexType>
            </element>
        </sequence>
    </complexType>


    <complexType name="OutputResponse">
        <sequence>
            <element name="ResponseCode" type="string"></element>
        </sequence>
    </complexType>

    <element name="getInputRequest" type="tns:InputRequest"></element>

    <element name="getOutputResponse" type="tns:OutputResponse"></element>
</schema>

用于创建SOAP请求,如: -

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.anirban.com/v1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:getInputRequest>
         <!--1 or more repetitions:-->
         <v1:Name>Abc</v1:Name>
         <v1:Name>Efg</v1:Name>
         <!--Optional:-->
         <v1:Url>http://localhost:8084/test?wsdl</v1:Url>
         <v1:Employee>
            <!--1 or more repetitions:-->
            <v1:VehicleList>ee</v1:VehicleList>
            <v1:VehicleList>ff</v1:VehicleList>
            <v1:EmployeeName>Anirban</v1:EmployeeName>
         </v1:Employee>
      </v1:getInputRequest>
   </soapenv:Body>
</soapenv:Envelope>

现在我的问题是,我想在两者之间添加一个元素,如: - <v1:Orders>Ord1,Ord2,Ord3</v1:Orders>,它将以逗号分隔取字符串值。那么如何添加元素介于两者之间的订单?是否可以在 complexType 的序列中添加一个将逗号分隔的字符串值的元素?请帮忙......

1 个答案:

答案 0 :(得分:1)

正如helderdarocha已经指出的那样,你几乎肯定会把你的元素指定为一系列元素:

<v1:Order>Ord1</v1:Order>
<v1:Order>Ord2</v1:Order>
<v1:Order>Ord3</v1:Order>

如果您愿意,可以将它们包装在v1:Orders元素中;不同的人在这样的事情上有不同的品味。

如果由于某种原因,用一系列原子值制作单个元素真的更好(我实际上并不相信它真的会更好,但很多人需要通过他们的痛苦经验来学习拥有而不是从其他人的痛苦经历中学习,然后它将在XSD和相关工具中更好地工作,使列表空白分离:

<v1:Orders>Ord1 Ord2 Ord3</v1:Orders>

这样,Orders元素可以声明为简单值列表,并且可以针对类型(整数,日期,IDREF,NCName,您选择的正则表达式定义的标记,...)测试各个值。 。 XSD验证器和下游的模式感知软件将看到一系列简单值,而不是一个。

从XSD的角度来看,将其作为逗号分隔列表是所有可能解决方案中最差的。 XSD列表类型是以空格分隔的,而不是逗号分隔的(并且不是任意 - 正则表达式分隔的,无论世界上的Perl爱好者多么喜欢它),因此XSD验证器和下游模式感知应用程序都不会看到一系列价值观;他们只会看到一个值,一个词汇空间受到长期复杂(并且可能是错误的,除非你比一般程序员更好)正则表达式的约束。如果单个标记应该表示整数,日期或其他一些XSD简单类型,则不会对它们进行类型验证。如果要限制列表的长度,只能通过用于验证字符串的正则表达式来实现;另一个错误的机会。

另一方面,如果单个标记没有词法约束,并且你真的坚持使用以逗号分隔的列表而不是以空格分隔的列表,那么根本就没有工作要做:只需声明Orders元素as xsd:string。由于XSD不会对逗号做任何特殊处理,因此不需要使用逗号做任何聪明的模式;由于令牌没有词法约束,因此在任何情况下都无法处理模式。