我有一个有趣的XML情况,我正在尝试为其编写XSD。我正在使用的Web服务有一种不寻常的方式来发送响应,因为它在某种程度上是通用的。
例如,
网络服务电话1:
<rootElement>
<result>
<resultset>
<row attr="some value" attr2="some value 2" />
</resultset>
</result>
</rootElement>
网络服务电话2:
<rootElement>
<result>
<resultset>
<row someOtherAttr="some value" someOtherAttr2="some value 2" />
</resultset>
</result>
</rootElement>
正如您所看到的,区分两个Web服务响应的唯一方法是行元素中的属性。
我通过为结果元素提供一个抽象元素尝试了一些不同的方法,这个方法适用于某一点,但我无法弄清楚如何允许JAXB选择在编组时使用哪个结果元素。
即
... other xs declarations excluded for sanity ...
<xs:element ref="abstractResult" />
... snip ...
<xs:element name="abstractResult" type="ResultType" abstract="true" />
<xs:complexType name="ResultType" abstract="true" />
<xs:complexType name="SomeResultType">
<xs:complexContent>
<xs:extension base="ResultType">
... snip ...
这种方法的问题是JAXB尝试在编组时实例化抽象ResultType,而不是搜索正确的实现。
有什么方法可以避免这种情况吗?
非常感谢!
答案 0 :(得分:0)
完成将模式分离为独立文件,其中有根元素的不同实现。
然后我将多个模式绑定到它们自己的命名空间,以便编组器能够区分相似的元素。
由于xml在没有来自webservice的命名空间的情况下进入,我使用JDom来设置命名空间,因为我知道目标对象类型在运行时将是什么。
希望这有助于任何有兴趣的人。