如何在XSD中使用xsi:type限制XML元素的值?

时间:2015-11-19 16:04:29

标签: xml xsd

我想根据属性值验证元素的文本值。例如

<Device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Parameter xsi:type="xsd:unsignedInt">-100</Parameter>
  <Parameter xsi:type="xsd:boolean"></Parameter>
  <Parameter>hello</Parameter>
</Device>

以上两点都应该失败。对于布尔值,除“true”或“false”(甚至空字符串)

外,不应接受任何内容

我的xml更复杂,有很多ObjectParameter个节点,这是我的xsd,它以递归方式验证所有这些节点

                          

    <xs:complexType name="deviceType">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="Object"/>
                    <xs:element ref="Parameter"/>
            </xs:choice>
    </xs:complexType>

    <xs:complexType name="objType">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="Object"/>
                    <xs:element ref="Parameter"/>
            </xs:choice>
            <!-- Add all valid attributes for 'Object' type here -->
            <xs:attribute name="Id" use="required"/>
            <xs:attribute name="Flag" use="required"/>
            <xs:anyAttribute processContents="lax"/>
    </xs:complexType>

    <xs:complexType name="paramType" mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="Object"/>
                    <xs:element ref="Parameter"/>
            </xs:choice>
            <xs:attribute name="Id" use="required"/>
            <xs:attribute name="Flag" use="required"/>
            <xs:anyAttribute processContents="lax"/>
    </xs:complexType>

但我正面临这个错误。

Type 'xsd:unsignedInt' is not validly derived from the type definition, 'paramType', of element 'Parameter'.
Type 'xsd:unsignedInt' is not validly derived from the type definition, 'paramType', of element 'Parameter'.

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

在XML文档中使用xsi:type

  1. 声明xsi名称空间前缀,通常在根元素上:

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
  2. 通常在根元素上声明xs(或xsd)名称空间前缀:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    
  3. 将任何XSD类型添加到您要约束的元素:

    xsi:type="xs:boolean"
    
  4. 这些更改直接在您的XML文档中进行。您不必对XSD进行任何更改。但是, 所选类型必须从XSD为给定元素 提供的类型中有效地派生。

    相关的W3C参考

    来自 XML Schema Part 1: Structures Second Edition ...

      

    <强> 2.6.1 xsi:type

         

    元素的Simple Type Definition (§2.2.1.2)中使用的Complex Type Definition (§2.2.1.3)·validation·通常是   通过引用适当的模式组件来确定。一个   然而,实例中的元素信息项可以是明确的   使用属性xsi:type断言其类型。这个的价值   属性是·QName·;见QName Interpretation (§3.15.3)   用于·QName·与类型相关联的方法   定义

    [...]

      

    <强> Validation Rule: Element Locally Valid (Element)

         

    4.3如·local type definition·{type definition} {disallowed substitutions}的联合,{type definition}必须有效地从{prohibited substitutions}派生,{ {3}}(如果是复杂的类型定义)或给定   类型派生OK(简单)中定义的{禁止替换}   (§3.14.6)(如果它是一个简单的类型定义)。

    来自 Type Derivation OK (Complex) (§3.4.6) ...

    <强> XML Schema Part 2: Datatypes Second Edition

    3 Built-in datatypes