我收到了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的性能更好),或者两者中的一个是采用的还是默认选择。
答案 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是错误的。