2014-01-19 174 views
5

我有一個XML,我想寫一個模式定義。問題是我不知道如何將xsi:type定義爲屬性。下面是XML元素:如何將xsi:type定義爲XML模式中的屬性?

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

我的XML的模式定義到目前爲止是這樣的:

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

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

我也試圖定義它像伊恩·羅伯茨建議:

<element name="SerializedData"/> 

然而,當我使用BPEL設計器以這種方式初始化它時:

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

我得到以下警告:

您輸入似乎不是有效的XML(這是需要某些類型的固定值的正常工作)的固定值。它將以文本格式保存。

如果我初始化它像這樣沒有任何警告:

<SerializedData>300.0</SerializedData> 

但問題是,我試圖調用Web服務期望請求SOAP消息包含屬性的xsi:type = 「XS:雙」。我如何使我的SOAP請求消息包含它?

任何幫助將不勝感激!

回答

12

你不需要 - 只聲明沒有類型的元素。

<element name="SerializedData" /> 

xsi:type屬性用於指示模式驗證,真正的類型的元素的特定實例是不是該元素的聲明的類型,而是從聲明的類型派生的子類型。通過聲明沒有類型的元素,你可以說它可以有任何類型,並且你將在實例中使用xsi:type來指定哪一個。

嚴格地說,您聲明的元素的類型是「ur-type」,它是XML Schema類型層次結構的根 - 所有類型,簡單和複雜,最終都從ur類型派生。如果你想限制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> 
+0

謝謝伊恩·羅伯茨的回覆。請閱讀我編輯的問題。 – Peter

+0

@Peter嘗試添加正確的名稱空間聲明。 –

+1

這個伎倆!謝謝! – Peter

4

的xsi:type屬性並不需要在架構中宣稱:它是隱式聲明,並且可以在任何元素上使用。但在一個實例中,它必須是有效的QName。

如果你寫

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

然後

(一)有命名空間良好的,你需要申報 「XSI」 命名空間

(B)是schema-有效,您還需要聲明「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> 
+0

必須將「xsi:type」值前綴爲「xs:」? –

+0

xsi:類型可以是模式中定義的任何類型,它不需要是內置類型。 –

+0

請問xsi:type =「double」是否有效?它會知道哪個模式屬於雙重模式嗎? –

相關問題