如何将 XSD 类型导入根架构?

Posted

技术标签:

【中文标题】如何将 XSD 类型导入根架构?【英文标题】:how to import XSD types into root schema? 【发布时间】:2012-02-12 20:36:30 【问题描述】:

这是我在foo.xsd 中现有的 XSD 架构,它只声明了类型:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
  targetNamespace="foo">
  <xs:complexType name="alpha">
    <!-- skipped -->
  </xs:complexType>
</xs:schema>

这是另一个模式,它声明了元素:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
  targetNamespace="foo">
  <xs:import schemaLocation="foo.xsd" namespace="foo" />
  <xs:element name="RootElement" type="alpha"/>
</xs:schema>

这是我从 Java 中的 SAX 解析器得到的:

"The namespace attribute 'foo' of an <import> element information 
item must not be the same as the targetNamespace of the schema it exists in."

我做错了什么?

【问题讨论】:

【参考方案1】:

当涉及的 XSD 的 targetNamespace (tns) 属性指定且相同时,仅允许 xsd:include (targetNamespace 属性不能有空字符串作为其值)。

然而,一个可能包含一个没有 tns 的模式 (s1) 来自一个有 tns 的模式 (s2);最终效果是 s1 组件采用 s2 模式的命名空间。这种用法通常被称为变色龙组合。

关于 SO 描述两者区别的参考是here。

【讨论】:

非常感谢,这正是我想要的! “tns”和“targetNamespace”一样吗?

以上是关于如何将 XSD 类型导入根架构?的主要内容,如果未能解决你的问题,请参考以下文章

使用C#导入使用XSD验证XML

如何将外部xsd导入另一个xsd?

如何在 xsd 文件中指定架构位置?

将 xsd 导入 wsdl

使用导入的命名空间解析 XML 模式

XSD 到 XML 的导入