首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用xsd:anyType元素中的验证

禁用xsd:anyType元素中的验证
EN

Stack Overflow用户
提问于 2017-11-15 09:34:48
回答 1查看 1.7K关注 0票数 2

具有具有xs:anyType类型元素的XML。

代码语言:javascript
复制
<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的任何示例:

代码语言:javascript
复制
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <payloadAny>
        <anything>anyContent</anything>
    </payloadAny>
</root>

当元素中有xsi:type属性时,我们发现了这个问题,如下所示:

代码语言:javascript
复制
<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属性禁用验证。

代码语言:javascript
复制
<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>

现提出以下问题:

  1. 如何在xsi:type元素中禁用xs:anyType验证(如processContents="skip)
  2. 为什么<xs:any/><element type="xs:anyType"/>有这么大的区别?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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模式中显示的以下声明声明的:

代码语言:javascript
复制
<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"/>

不存在类似于processContentsxs:any上其他属性的复杂类型的参数化机制。为xs:anyType添加这样的机制需要额外的特殊机制( XSD还不够复杂吗?)你还想要更多吗?)也不会增加语言的表达能力。

随着设计决策的进行,这个看起来就像一个不需要思考的人。即使是XML工作组(从来没有对特设机制持怀疑态度)也认为这种特殊用途的机制是不必要的。

在建立在属性语法基础上的模式语言中,继承的属性可以用于参数化元素和/或类型,这种机制将是语言的一个自然部分,具有松散/严格/跳过处理的参数可能是有意义的。但是,XSD和其他广泛使用的模式语言都不是建立在属性语法之上的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47303808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档