xml schema中没有map这种数据类型,因此只能够对Map进行模拟。首先定义Map中的item的类型
<xsd:complexType name=”StringMapItemType”>
<xsd:sequence>
<xsd:element name=”key” type=”xsd:string” />
<xsd:element name=”value” type=”xsd:string” />
</xsd:sequence>
</xsd:complexType>
然后定义使用该item的类型
<xsd:complexType name=”Opt”>
<xsd:sequence>
<xsd:element name=”optString” type=”tns:StringMapItemType” minOccurs=”0″ maxOccurs=”unbounded” />
</xsd:complexType>
这样定义出了一个比较像Map<String, String>的类,一般的wsdl2java工具会把上述两个复杂类型转化为下面的类定义:
public class StringMapItemType {
protected String key;
protected String value;
}
public class Opt {
protected List<StringMapItemType> optString;
}
可以发现,生成的optString的定义并不是Map,而是一个List<StringMapItemType>类型。这个类型与Map已经比较接近了,主要的区别是Map<String, String>中,key是唯一的,而List<StringMapItemType>含有的item的可以具有相同的key。可以通过xsd:selector 和xsd:field 约束达到这一点。参考下面的定义:
<xsd:element name=”opt” type=”tns:Opt”>
<xsd:unique name=”optString”>
<xsd:selector xpath=”optString” />
<xsd:field xpath=”key” />
</xsd:unique>
</xsd:element>
上面的xml定义了一个名为opt的元素,其类型为tns:Opt,并通过xpath的定位到optString中所有元素的key值都是唯一的。这样我们就得到了一个比较像Map<String, String>的对象。虽然对数据的访问不如Map那么直接,但是也算基本达到了要求。