2011-11-21 56 views
1

我正在爲來自外部系統的xml創建一個模式。我有模擬這種類型的問題:如何在xml模式中對此進行建模?

<main> 
... 
    <Foo TYPE="Numeric"/> 
    <Bar TYPE="Numeric">12.0</Bar> 
... 
</main> 

我已創建一個類型擴展雙:

<xs:complexType name="myNumeric"> 
    <xs:simpleContent> 
    <xs:extension base="xs:double"> 
     <xs:attribute name="TYPE" type="xs:string"/> 
    </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 

.... 

<xs:element name="Foo" type="myNumeric" /> 
<xs:element name="Bar" type="myNumeric" /> 

然而,這還不夠好,當我嘗試驗證我得到一個錯誤抱怨的架構:''不是'double'的有效值。

任何提示?

謝謝

回答

2

xs:double不能有空值作爲值。如果你想紀念這個類型爲「空」,那麼你可以使用XSI:無=「true」以表明這是一個「空」雙:

<Foo TYPE="Numeric" xsi:nil="true" /> 

要允許這種使用的nillable =「真」在您的模式中

<xs:element name="Foo" type="myNumeric" nillable="true" /> 

您將需要在xml實例中包含對XML模式實例名稱空間的引用。

<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ... > 
... 
</MyRoot> 
+0

謝謝,這是偉大的,但它意味着我需要修改輸入XML。我不是在控制xml代,我想避免在可能的情況下對其進行預處理。 –

+0

然後我想不出如何做到這一點,而不是延遲打印到下游進程,並將所有內容都作爲xs:字符串。這不是一個好的解決方案。 –

2

您可以創建一個具有2種簡單類型聯合的特定類型。例如下面的「myType」似乎回答你的問題:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:my="myNamespace" targetNamespace="myNamespace"> 
    <xs:simpleType name="myType"> 
     <xs:union memberTypes="xs:double my:empty"/> 
    </xs:simpleType> 
    <xs:simpleType name="empty"> 
     <xs:restriction base="xs:string"> 
      <xs:length value="0"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema>