集合中的每个元素必须在 XSD 中对应的 <element></element> 之间?

Each element of a collection must go between their corresponding <element></element> in XSD?

我收到了第一个版本的 WSDL,其模式如下:

<xs:complexType name="AComplexType">
   <xs:sequence>
     <xs:element minOccurs="0" name="description" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="version" nillable="true" type="xs:int"/>
   </xs:sequence>
</xs:complexType>

<xs:complexType name="Response">
  <xs:sequence>
    <xs:element minOccurs="0" name="responseDescription" nillable="true" type="xs:int"/>
    <xs:element maxOccurs="unbounded" minOccurs="0" name="listOfElements" nillable="true" type="AComplexType"/>
  </xs:sequence>
</xs:complexType> 

下面的xml对上面的xsd有效:

<Response>
  <responseDescription>A response description</responseDescription>
  <listOfElements>
    <description>An element descrition</description>
    <version>1</version>
    <description>Another element descrition</description>
    <version>1</version>
    ...
  </listOfElements>
</Response>

此外,我能够使用 xjc 为这种类型创建 类,所以看起来这是一个有效的模式。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Response", propOrder = {
    "responseDescription",
    "listOfElements"
})
public class ConsultaExpedienteGATResponse {


    @XmlElementRef(name = "estado", namespace = "...", type = JAXBElement.class, required = false)
    protected JAXBElement<String> responseDescription;
    @XmlElement(nillable = true)
    protected List<AComplexType> listOfElements;

    ...
}

但是,我认为这种模式是无效的,应该是这样的:

<xs:complexType name="Response">
  <xs:sequence>
    <xs:element minOccurs="0" name="responseDescription" nillable="true" type="xs:int"/>
      <xs:element name="listOfElements">
        <xs:complexType>
         <xs:sequence>
          <xs:element maxOccurs="unbounded" name="oneElement" type="AComplexType"/>
         </xs:sequence>
        </xs:complexType>
       </xs:element>
  </xs:sequence>
</xs:complexType> 

使用此架构,xml 略有不同:

<Response>
  <responseDescription>A response description</responseDescription>
  <listOfElements>
    <oneElement>
      <description>An element descrition</description>
      <version>1</version>        
    </oneElement>
    <oneElement>
      <description>Another element descrition</description>
      <version>1</version>        
    </oneElement>
    ...
  </listOfElements>
</Response>

所以,我想知道是否每个选项都有 pros/cons(例如解析 xml 的性能更好),或者两者之一是采用的还是默认的选择。

此决定不会影响性能。

您之前的设计依赖于邻接关系将描述与版本相关联。这不是 "invalid." 虽然您会在 document-based XML 中看到这种模式(例如段落前面的标题),但它是 non-ideal 对于 data-oriented XML.

而是像在后一个设计中那样通过层次结构或通过属性(特别是对于 version,这不太可能需要从属标记)使关联更加明确。另见 XML attribute vs XML element

这两种编写模式的风格有时称为 "venetian blind" 和 "russian doll"。 Google 这些条款,你会发现很多人争论在什么情况下哪个最好。就像编码风格的所有问题一样,讨论往往会产生更多的热量而不是光。两者都完全有效,都不会带来任何性能优势。

我自己的偏好倾向于 "venetian blind"(具有命名的全局元素声明 and/or 命名的复杂类型,但通常不会两者兼而有之);因为全局声明是可重用的。如果您使用模式感知 XSLT 和 XQuery,这将特别有用,因为全局元素和类型名称随后可以在您的 XSLT/XQuery 代码中被利用。

虽然 xml

<Response>
  <responseDescription>A response description</responseDescription>
  <listOfElements>
    <description>An element descrition</description>
    <version>1</version>
    <description>Another element descrition</description>
    <version>2</version>
    ...
  </listOfElements>
</Response>

对指定的第一个模式有效,当它被解组到 xjc 生成的 类(带有 JAXB 注释)时,属性 listOfElements 是一个仅包含的列表最后一个元素(在本例中是具有描述"Another element description" 和版本 2 的元素)。

此架构的有效 xml 实际上是

<Response>
  <responseDescription>A response description</responseDescription>
  <listOfElements>
    <description>An element descrition</description>
    <version>1</version>
  </listOfElements>
  <listOfElements>
    <description>Another element descrition</description>
    <version>2</version>
  </listOfElements>
</Response>

(混淆来自于使用由 WSDL 的开发人员手动生成的不正确的 xml,但后来我通过 SOAP UI 为该 WSDL 创建了一个请求并且错误有变得清晰了)。

剩下的就是定义是否最好为列表设置一个根元素,例如

<Response>
  <responseDescription>A response description</responseDescription>
  <listOfElements>
    <AComplexType>
      <description>An element descrition</description>
      <version>1</version>
    </AComplexType>
    <AComplexType>
      <description>Another element descrition</description>
      <version>2</version>
    </AComplexType>
  </listOfElements>
</Response>

但要回答我原来的问题,第一个 XML 描述是错误的。