2011-11-21 54 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>