xml - targetNamespace 和 xmlns 没有前缀,有什么区别?

标签 xml xsd schema xml-namespaces prefix

在一个 xml 模式文档中,如果我有 targetNamespace 和 xmlns 没有前缀

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://example.com/" xmlns="http://example.com/">

它们之间的确切区别是什么?我的理解是,如果您有一个没有前缀的 xmlns,那么所有没有前缀的元素都会获得该命名空间,并且...令人困惑的是,targetNamespace 也是如此。

最佳答案

targetNamespace 是一个 XML 架构“工件”;其目的:指示模式文件描述的特定 XML 命名空间。

xmlns - 因为 XML 模式是一个 XML 文档,所以可以为 XML 文件本身定义一个默认的 XML namespace (这就是 xmlns 属性的作用);其含义是多重的:创作和组合。例如,不必为模式中定义的项目使用前缀,这些项目稍后会在同一文件的其他地方引用(例如,全局 simpleType 用作属性或元素的类型)。

根据我的经验,许多 XML Schema 作者认为这是“最佳实践”...因此您走在正确的轨道上。

在XSD中,targetNamespace规定了一个schema组件限定名的命名空间部分,包括元素、属性、组和属性组、简单类型和复杂类型。 XSD 中定义的某些限定名称(元素和属性)由 XML 实例文档“直接”使用。其他的,比如对于类型,可以通过 xsi:type 来引用。实例 XML 文档中的属性。其余的(组、属性组)用于促进模式组合(通过引用)。

我还认为(通常)人们从两个角度来设计 XSD:

  • 匹配现有的 XML。在这种情况下,如果您的 XML 使用命名空间,对于使用的每个命名空间,您最终会得到一个具有匹配的 targetNamespace 属性的 XSD 架构元素。

  • 纯造型。然后,您会认为 targetNamespace 类似于 UML 包、数据库模式、Java 包或 .NET namespace ,以及在这种情况下的所有含义。从根本上说,它是一种避免命名冲突的机制;尽管如此,它也是一种在主题领域等方面划分模型的机制。

关于xml - targetNamespace 和 xmlns 没有前缀,有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7190572/

相关文章:

xml - 从 xsd 架构引用 spring bean 值

java - xsd 架构文件 - 显示 elementName 已定义

iphone - json 模式到 objective c - 模型类生成

java - 为什么我的操作栏没有显示以及如何修复它?

java - 使用 XPath 连接选定子节点的值

java - Java读取UTF16编码的XML文件

java - Java读取xml文件内容的方法

c# - 使用 XSD 创建 XML 并发布到 URL 的步骤

c++ - 使用其架构定义从 Solidworks 读取 Parasolid 文本 *.x_t 文件

mysql - Sqoop 使用 "sqoop create-hive-table"创建表模式