XSD架构抽象类型问题

时间:2011-05-12 14:51:46

标签: xsd

我的xsd架构文件有问题。

我的架构上有这种抽象的复杂类型:

<complexType name="Action" abstract="true">
    <sequence>
        <element name="actionType">
            <complexType>
                <choice>
                    <element name="ALARMACTION"/>
                    <element name="REPORTDATAACTION"/>
                    <element name="ENABLEOBSERVATIONACTION"/>
                    <element name="DISABLEOBSERVATIONACTION"/>
                    <element name="SETOBSERVATIONSCHEDULEACTION"/>
            <element name="VERIFYOVERTIMEACTION"/>
                </choice>
            </complexType>
        </element>
    </sequence>
</complexType>

这是Action抽象元素的具体实现:

<complexType name="AlarmAction">
    <complexContent>
        <extension base="ref:Action">
            <sequence>
                <element name="alarmCode" type="integer"/>
                <element name="report" type="string"/>
            </sequence>
        </extension>
    </complexContent>
</complexType>

此元素引用抽象的Action元素:

<complexType name="Conclusion">
    <sequence>
        <element minOccurs="0" name="observationSet" type="ref:ObservationSet"/>
        <element name="action" type="ref:Action"/>
    </sequence>
</complexType>

我的xml实例出错:

            <Conclusion>
                <observationSet>
                    <observationPhenomenum>HIGH_HEARTBEAT</observationPhenomenum>
                </observationSet>
                <action>
                    <actionType>
                        <ENABLEOBSERVATIONACTION></ENABLEOBSERVATIONACTION>
                    </actionType>
                <observationId>1</observationId>
                <observationId>2</observationId>
                </action>
        </Conclusion>

netbeans上的错误是这样的:cvc-type.2:对于元素操作,类型定义不能是抽象的。 [104]

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:5)

我假设架构有效;你确实有一个全局元素的定义,本地名称为“结论”,一个非抽象的复杂类型派生自Action,重复 observationId 元素(例如 XYZAction )。

如果您将 xsi:type =“ XYZAction 添加为操作元素的属性,则会重新解决您的问题。同样,属性值必须与非抽象类型的名称匹配,该名称源自抽象Action。

我的建议是,如果有疑问,请使用工具为您考虑的方案生成示例XML。我正在使用QTAssistant,因为它允许我使用简单的拖放XML Schema元素轻松构建任何可想象的场景。

答案 1 :(得分:4)

您可以使用抽象complexType作为元素类型,但是使用此模式编写XML实例文档的用户必须声明元素的类型。

对于您的示例,这意味着您必须按如下方式编写它:

<Conclusion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="conclusion.xsd">
  <observationSet>
    <observationPhenomenum>HIGH_HEARTBEAT</observationPhenomenum>
  </observationSet>
  <action xsi:type="AlarmAction">
    <actionType>
      <ENABLEOBSERVATIONACTION></ENABLEOBSERVATIONACTION>
    </actionType>
    <alarmCode>10</alarmCode>
    <report>Whatever</report>
  </action>
</Conclusion>

有关详细信息,请查看此处:http://pic.dhe.ibm.com/infocenter/wci/v6r0m0/index.jsp?topic=%2Fcom.ibm.websphere.cast_iron.doc%2Fmap_Selecting_a_Substitution_Type.html

答案 2 :(得分:0)

针对wsdl验证请求xml时,您必须包括以下属性

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" use this in the root element 

on abstract type element 

<abstractElement name="XYZ" xsi:type="Name of your instance" > </abstractElement>