【发布时间】:2017-11-15 09:34:48
【问题描述】:
具有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 不再针对具有xs:anyType 元素的XML Schema 进行验证。
E [Xerces] cvc-elt.4.2:无法将“ForeignType”解析为元素“任何东西”的类型定义。
当使用<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>
现在的问题如下:
- 如何在
xs:anyType元素中禁用xsi:type验证(如processContents="skip) - 为什么
<xs:any/>和<element type="xs:anyType"/>有这么大的区别?
【问题讨论】:
标签: xml validation xsd