如何在xml模式中对此进行建模?

如何在xml模式中对此进行建模?,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我正在为来自外部系统的xml创建模式。我对这种类型的建模有问题: <main> ... <Foo TYPE="Numeric"/> <Bar TYPE="Numeric">12.0</Bar> ... </main> ... 12 ... 我创建了一个扩展双精度的类型: <xs:complexType name="myNumeric"> <xs:simpleContent> <xs

我正在为来自外部系统的xml创建模式。我对这种类型的建模有问题:

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

...
12
...
我创建了一个扩展双精度的类型:

<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”的有效值

有什么提示吗


谢谢

xs:double不能将空sting作为值。如果要将此类型标记为“null”,则可以使用xsi:nil=“true”指示这是一个“空”双精度:


要允许这种情况,请在模式中使用nillable=“true”

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

您需要在XML实例中包含对XML模式实例命名空间的引用

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

...

xs:double不能将空sting作为值。如果要将此类型标记为“null”,则可以使用xsi:nil=“true”指示这是一个“空”双精度:


要允许这种情况,请在模式中使用nillable=“true”

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

您需要在XML实例中包含对XML模式实例命名空间的引用

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

...

您可以创建一个特定类型,它是两个简单类型的并集。例如,下面的“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>

您可以创建一个特定类型,它是两个简单类型的并集。例如,下面的“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>


谢谢,这很好,但是这意味着我需要修改输入xml。我不控制xml的生成,如果可能的话,我希望避免预处理它。那么,除了将键入延迟到下游进程,并将所有内容都作为xs:string来处理之外,我想不出如何做。这不是一个好的解决方案。谢谢,这很好,但是这意味着我需要修改输入xml。我不控制xml的生成,如果可能的话,我希望避免预处理它。那么,除了将键入延迟到下游进程,并将所有内容都作为xs:string来处理之外,我想不出如何做。这不是一个好的解决方案。