集合中的每个元素必须在 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 描述是错误的。
我收到了第一个版本的 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 描述是错误的。