1

我正在为来自外部系统的 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' 的有效值。

有什么提示吗?

谢谢

4

2 回答 2

2

xs:double 不能将空字符串作为值。如果您想将此类型标记为“null”,那么您可以使用 xsi:nil="true" 来指示这是一个“空”双精度:

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

要允许在您的架构中使用 nillable="true"

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

您需要在 xml 实例中包含对 XML Schema 实例命名空间的引用。

<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ... >
...
</MyRoot>
于 2011-11-21T10:09:16.363 回答
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>
于 2011-11-21T14:32:34.920 回答