具有具有xs:anyType类型元素的XML。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="payloadAny" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>XML的任何示例:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<payloadAny>
<anything>anyContent</anything>
</payloadAny>
</root>当元素中有xsi:type属性时,我们发现了这个问题,如下所示:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<payloadAny>
<anything xsi:type="ForeignType">anyContent</anything>
</payloadAny>
</root>这个具有xsi:type属性的XML不再使用XML元素对XML进行验证。
E Xerces cvc-elt.4.2:无法将“ForeignType”解析为元素“anything”的类型定义。
当使用<xs:any/>元素而不是<element type="xs:anyType"/>时,可以使用processContents属性禁用验证。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="any">
<xs:sequence>
<xs:any processContents="skip"/>
</xs:sequence>
</xs:complexType>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="payloadAny" type="any"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>现提出以下问题:
xsi:type元素中禁用xs:anyType验证(如processContents="skip)<xs:any/>和<element type="xs:anyType"/>有这么大的区别?发布于 2017-11-15 18:47:03
如何在
xsi:type元素中禁用xs:anyType验证(如processContents="skip")
使用您在架构中定义的元素和类型结构,无法禁用模式处理器对xsi:type属性的验证。xsi:type的声明内置于每个符合XSD模式验证器中,每当具有xsi:type属性的元素被严格或松散地验证时,就会找到该声明,并将根据该声明验证xsi:type属性。有效的xsi:type属性具有一个QName值,该值标识架构中的类型定义。如果QName值没有标识类型定义,则属性无效。
从您报告的错误消息中,您的架构似乎不包含扩展名称为{}ForeignType的任何类型。
解决这个问题的一种方法是声明payloadAny元素真正想要的类型,它不是xs:anyType,而是一个带有skip通配符的不同类型。第二个模式示例展示了原理,尽管您的{}any类型与xs:anyType不同,只允许一个元素子元素,而不允许多个元素和字符数据。(如果您只想要一个元素作为payloadAny的子元素,那么xs:anyType太松散了。)
请注意,报告的错误不是声称anything元素对ForeignType类型无效,而是报告xsi:type属性本身无效,因为它违反了约束元素的第4.2条在本地有效。这反过来又使payloadAny无效。
为什么
<xs:any/>和<element type="xs:anyType"/>有这么大的区别?
内置类型xs:anyType的行为(大致上)似乎是用模式文档XSD1.0模式中显示的以下声明声明的:
<xs:complexType name="anyType" mixed="true">
<xs:annotation>
<xs:documentation>
Not the real urType, but as close an approximation as we can
get in the XML representation</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any minOccurs="0"
maxOccurs="unbounded"
processContents="lax"/>
</xs:sequence>
<xs:anyAttribute processContents="lax"/>
不存在类似于processContents和xs:any上其他属性的复杂类型的参数化机制。为xs:anyType添加这样的机制需要额外的特殊机制( XSD还不够复杂吗?)你还想要更多吗?)也不会增加语言的表达能力。
随着设计决策的进行,这个看起来就像一个不需要思考的人。即使是XML工作组(从来没有对特设机制持怀疑态度)也认为这种特殊用途的机制是不必要的。
在建立在属性语法基础上的模式语言中,继承的属性可以用于参数化元素和/或类型,这种机制将是语言的一个自然部分,具有松散/严格/跳过处理的参数可能是有意义的。但是,XSD和其他广泛使用的模式语言都不是建立在属性语法之上的。
https://stackoverflow.com/questions/47303808
复制相似问题