如何将xsi:type定义为XML模式中的属性?

时间:2014-01-19 12:30:56

标签: xml xsd

我有一个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 =&#34; xs:double&#34;。如何将SOAP请求消息包含在内?

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:13)

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

<element name="SerializedData" />

xsi:type属性用于向模式验证器指示元素的特定实例的实际类型不是元素的声明类型,而是从声明的类型派生的子类型。通过声明没有类型的元素,您说它可以具有任何类型,并且您将在实例中使用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>

答案 1 :(得分:4)

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>

答案 2 :(得分:0)

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