单个XSD文件能否配置包含多个xsd:schema元素?
结论
单个XSD文件不允许包含多个xsd:schema元素,你遇到的两类报错均为违反基础语法规范导致:
- 并列写两个
xsd:schema节点的写法,直接违反XML核心语法规则:一个格式良好的XML文档有且仅有一个根节点,因此会抛出Multiple root tags错误,该错误和XSD规范无关,是XML格式层面的硬性限制。 - 嵌套
xsd:schema节点的写法,不符合XSD的结构规范:xsd:schema是XSD文档的固定根元素,它的合法子元素仅包含报错信息中列出的simpleType、complexType、group、attributeGroup、element、attribute、notation、annotation八类,不支持嵌套另一个xsd:schema元素,因此会触发内容非法的校验错误。
多命名空间结构定义的合规实现方案
如果你需要定义分属不同目标命名空间的多组服务描述结构,可选择以下两种合法方式实现:
方案1:拆分文件+导入引用
将不同目标命名空间的Schema定义拆分为独立的XSD文件,在主XSD文件中通过xsd:import标签引入外部命名空间的定义即可,示例:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified" targetNamespace="[target1]" xmlns:tns="[target1]"> <!-- 引入target2命名空间的Schema定义 --> <xsd:import namespace="[target2]" schemaLocation="target2对应XSD文件的相对/绝对路径"/> <!-- 后续可直接引用target2命名空间下定义的元素、类型 --> </xsd:schema>
方案2:单文件统一命名空间
如果必须把所有定义放在同一个物理文件中,只能为该XSD设置唯一的targetNamespace,将所有服务描述的结构定义全部放在同一个xsd:schema根节点内,通过类型命名、自定义分组的方式区分不同服务的结构即可。
内容的提问来源于stack exchange,提问作者xay yec
相关产品推荐
相关产品推荐

