xml - 可以验证为 xsd:any 给出的元素结构吗?
问题描述
我偶然发现了这个关于 xsd:any 的w3schools 条目(请不要评论一般使用 w3schools 作为参考,这个问题是关于 w3schools 在这种特殊情况下是否正确)。它基本上描述了您将此元素作为基础(在某些模式中family.xsd
):
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
然后,您定义了一个额外的架构children.xsd
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.w3schools.com"
xmlns="https://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="children">
<xs:complexType>
<xs:sequence>
<xs:element name="childname" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
现在他们说基于这些模式,你可以编写这个有效的文档:
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns="http://www.microsoft.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.microsoft.com family.xsd
https://www.w3schools.com children.xsd">
<person>
<firstname>Hege</firstname>
<lastname>Refsnes</lastname>
<children>
<childname>Cecilie</childname>
</children>
</person>
<!-- ... -->
</persons>
假设未显示其定义的周围结构是有效的,我的问题是:验证器是否可以并且将实际检查<children>
此处元素的正确结构,如果可以,如何?
我的理解是第二个模式定义了一个根是<children>
元素的文档。但是,XSD 不提供从元素名称到类型的直接映射,因为在不同范围内具有相同名称的元素可能具有不同的类型(对吗?)。因此,正如我所看到的,验证器无法知道<children>
内部给出的元素<person>
实际上应该根据第二个模式中的定义进行验证。因此,第二个模式在这里是无用的,即使<children>
包含一些元素,文档也是有效的<foo/>
。那是对的吗?
解决方案
上的processContents="strict"
属性xs:any
表示此处出现的元素必须具有全局元素声明,并且必须针对该声明有效。对于任何给定的元素名称,只能有一个全局元素声明(全局声明是作为 的子项出现的声明xs:schema
)。
在您的情况下,由于命名空间,该文档无效。children.xsd
您的架构文档的目标名称空间是https://www.w3schools.com
,但children
实例中的元素在名称空间中http://www.microsoft.com
。所以验证器应该报告没有children
找到全局元素声明。
推荐阅读
- ios - 禁用警报消息上的动态字体大小
- oracle-apex - Oracle Apex:使用特定日历显示日期
- react-native - 用不同的项目大小反应原生动态水平网格
- r - R 和 HDF5:读取具有嵌套 H5T_ARRAY 的 H5T_COMPOUND 数据类型
- android - 关于嵌套片段中应用程序的 YouTubePlayer API 的问题
- javascript - 按键值过滤对象
- ios - 在 Cocoa Touch 框架中安装 Firebase iOS SDK
- python - 表单中的 Django JSON 字段
- git - 在 Docker 构建期间使用 git 子模块
- memory-management - 使用 procdump 进行转储时,进程的内存使用量会增加。这甚至可能吗?