【问题标题】:How to define xsi:type as an attribute in XML-schema?如何将 xsi:type 定义为 XML 模式中的属性?
【发布时间】:2014-01-19 12:30:55
【问题描述】:

我有一个要为其编写模式定义的 XML。问题是我不知道如何将 xsi:type 定义为属性。这是 XML 元素:

<SerializedData xsi:type="xs:double">300.0</SerializedData>

到目前为止,我的 XML 模式定义如下所示:

<complexType name="SerializedDataType">
    <simpleContent>
        <extension base="double">

        </extension>
    </simpleContent>
</complexType>

我也尝试过像 Ian Roberts 建议的那样定义它:

<element name="SerializedData"/>

但是,当我使用 BPEL 设计器来初始化它时:

<SerializedData xsi:type="xs:double">300.0</SerializedData>

我收到以下警告:

您输入的固定值似乎不是有效的 XML(某些类型的固定值需要它才能正常工作)。它将以文本格式保存。

如果我这样初始化它没有警告:

<SerializedData>300.0</SerializedData>

但问题是我试图调用的 Web 服务期望请求 SOAP 消息包含属性 xsi:type="xs:double"。如何让我的 SOAP 请求消息包含它?

任何帮助将不胜感激!

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    您不需要 - 只需声明没有类型的元素。

    <element name="SerializedData" />
    

    xsi:type 属性用于向模式验证器指示元素的特定实例的真实类型不是元素的声明类型,而是从声明类型派生的子类型。通过声明没有类型的元素,您是说它可以具有 any 类型,并且您将在实例中使用 xsi:type 来指定哪个类型。

    严格来说,您要声明一个类型为“ur-type”的元素,它是 XML Schema 类型层次结构的根 - 所有类型,简单和复杂,最终都派生自 ur-type。如果您想将 SerializedData 元素限制为仅包含简单内容(无子元素或属性),请将其声明为

    <element name="SerializedData" type="anySimpleType" />
    

    关于你问题的第二部分,你的设计工具是正确的,孤立的

    <SerializedData xsi:type="xs:double">300.0</SerializedData>
    

    不是正确的 XML,因为尚未声明 xsi 命名空间。尝试添加命名空间声明:

    <SerializedData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xsi:type="xs:double">300.0</SerializedData>
    

    【讨论】:

    • 感谢伊恩·罗伯茨的回复。请阅读我编辑的问题。
    • “如果您想将 SerializedData 元素限制为仅简单的内容(没有子元素或属性),然后将其声明为“如果我希望它限制为扩展特定复杂类型的类型怎么办?
    【解决方案2】:

    xsi:type 属性不需要在模式中声明:它是隐式声明的,可以在任何元素上使用。但在某些情况下,它必须是有效的 QName。

    如果你写

    <SerializedData xsi:type="xs:double">300.0</SerializedData>
    

    然后

    (a) 要成为命名空间格式良好,您需要声明“xsi”命名空间

    (b) 要使模式有效,您还需要声明“xs”命名空间。

    正如罗伯茨所说,这意味着你应该写

    <SerializedData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xsi:type="xs:double">300.0</SerializedData>
    

    【讨论】:

    • “xsi:type”值必须以“xs:”为前缀吗?
    • xsi:type 可以是 schema 中定义的任何类型,不需要是内置类型。
    • xsi:type="double" 是否有效?它会知道双重模式属于哪个模式吗?
    • xsi:type="double" 仅当您具有定义具有本地名称“double”的类型的无命名空间模式时才有效。它与 XML Schema 命名空间中的“double”类型不匹配。
    【解决方案3】:

    这个帖子中的答案对我来说并不是很容易理解,我发现另一个帖子对解决方案有更明确的解释:C# serializing xsi:type and xsd。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多