我想根据属性值验证元素的文本值。例如
<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更复杂,有很多Object
和Parameter
个节点,这是我的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'.
我该如何解决这个问题?
答案 0 :(得分:6)
xsi:type
:声明xsi
名称空间前缀,通常在根元素上:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
通常在根元素上声明xs
(或xsd
)名称空间前缀:
xmlns:xs="http://www.w3.org/2001/XMLSchema"
将任何XSD类型添加到您要约束的元素:
xsi:type="xs:boolean"
这些更改直接在您的XML文档中进行。您不必对XSD进行任何更改。但是, 所选类型必须从XSD为给定元素 提供的类型中有效地派生。
来自 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) ...