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

时间:2016-10-05 12:59:23

标签: xml xsd jaxb xsd-validation

我收到了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>

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

3 个答案:

答案 0 :(得分:1)

编写架构的两种风格有时被称为“百叶窗帘”和“俄罗斯娃娃”。谷歌这些条款,你会发现很多人争论谁在哪种情况下最好。像编码风格的所有问题一样,讨论往往产生比光更多的热量。两者都是完全有效的,并且都不会给任何性能优势。

我自己的偏好倾向于“百叶窗”(使用命名的全局元素声明和/或命名的复杂类型,但通常不是两者);因为全局声明是可重用的。如果您使用模式感知XSLT和XQuery,这将非常有用,因为可以在XSLT / XQuery代码中利用全局元素和类型名称。

答案 1 :(得分:0)

此决定不会影响效果。

您以前的设计依赖于将描述与版本相关联。这不是'#34;无效。&#34;虽然您会在基于文档的XML中看到这种模式(例如段落前面的标题),但它对于面向数据的XML来说并不理想。

相反,通过层次结构使关联更加明确,就像在后一种设计中一样,或者通过属性(特别是对于++来说,它不太可能需要从属标记)。另请参阅XML attribute vs XML element

答案 2 :(得分:0)

虽然是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是仅包含最后一个元素的列表(在本例中为元素描述“另一个元素描述”和版本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创建了一个Request,错误已经变得清晰了。)

剩下的就是定义是否有更好的列表根元素,如

<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是错误的。