Xml模式命名空间
1)我认识到命名空间是区分使用XML模式指定的不同模式/词汇表的一种方式,但我不明白为什么命名空间(模式正在开发词汇表)是一个好主意,在模式本身内指定(通过targetNamespace
属性)。Xml模式命名空间
a)如果我们能够将特定名称空间与实例文档中的特定词汇表/模式关联起来,会不会更好?这样,那些编写实例文档就可以完全自由地将模式与任何他们想要的名称空间名称关联起来?!
b)我在指定目标名称空间的模式中看到的好处是,它的创建者可以选择将文档放在名称空间的末尾,以描述该名称空间的元素(假定架构使用URL作为名称空间) 。还有其他好处吗?
2)如果架构没有targetNamespace
,则必须使用noNamespaceSchemaLocation
属性而不是schemaLocation
属性(在实例文档中)引用特定架构。
如果文档实例只是指定模式的位置并让XML模式验证程序判断模式是否指定了targetNamespace
,那么这样做会不会更简单?
谢谢
你的想法命名空间的“后期绑定”是不坏,但目前的命名空间的目的之一就是让处理器弄清楚要使用的架构。
在这个过程中,“schemaLocation”属性只是一个提示,很多时候根本没有用处。
考虑以下情形:
- 我对JMS接收XML消息
- 我有可能需要应用几种可能模式;将模式中的URL硬编码到XML文档本身不起作用,因为在这种情况下我无法移动环境。
- 处理器使用XML文件中元素的名称空间在内存模式缓存中查找模式。
在这种情况下,您可以说“让应用程序维护从命名空间到模式的映射,但模式本身内部没有指定名称空间的原因。不幸的是,当一个模式混合多个名称空间和导入时,这会导致问题。根据您选择的XML文件,您可能会在模式中创建名称冲突。
希望这是有道理的。
“•处理器使用XML文件中元素的命名空间在内存模式缓存中查找模式。在这种情况下,你可以说“让应用程序维护从命名空间到模式的映射,命名空间在模式本身内部没有任何理由”;“我想象在a中描述的实现)对于这种场景是完美的假设我们能够在运行时通知处理器它应该映射哪个Xml Schema元素的名称空间? – user437291 2010-10-21 19:35:26
“不幸的是,当架构将多个名称空间与导入混合在一起时,会导致问题。根据您选择的XML文件,您可能会在模式中创建名称冲突。“ 我想即使使用a)中描述的实现,问题也可以解决? – user437291 2010-10-21 19:35:49
我知道XML Namespaces只有一个定义,并且在http://www.w3.org上也有一个XML Schema定义的定义。由于XML Schema非常复杂,因此决定了XML Schema Part 0: Primer Second Edition,XML Schema Part 1: Structures Second Edition和XML Schema Part 2: Datatypes Second Edition三部分中的标准。
如果你知道更多XML Namespaces和XML Schema的定义(更多“词汇表”),请发布你定义的链接。
targetNamespace
在任何模式的根目录中的含义很容易清楚。XML不是一种语言。它是一种元语言。 XML Schema帮助我们定义一种语言。我们必须为我们定义的语言(模式)提供一个唯一的名称。它是模式的targetNamespace
。所以它的某些文件应该被解释为用美国英文写成的文件,在GB英文中可能不太正确。
因此,模式中的targetNamespace
是唯一的,在XML文件中声明了元素的名称空间,这意味着我们以写入文档的确切语言(和方言)的方式进行定义。你也可以非常精确地说出相应名称应该被解释的上下文。
如果定义了一个没有targetNamespace
的模式,意味着来自XML文档的相应元素和属性也必须属于“no namespace”。 noNamespaceSchemaLocation
属性或schemaLocation
属性的用法是不是必需的。所以你你一定不要引用XML文档中的模式。在这种情况下,XML文档的读者应该从相应的上下文中了解您的意思。
在你的问题的最后,你问
,那岂不是更简单的,如果不是 文档实例只会指定 XML模式的位置,让 Xml架构验证弄清楚 是否不是架构指定 targetNamespace?
但noNamespaceSchemaLocation
属性的值恰好是定义所用模式的XSD文件的路径。 schemaLocation
属性的值是名称空间,XSD文件的路径被空白分隔。所以属性已经完成了你的建议。
指定目标名称空间的单个模式(或“词汇表”)的好处是,它允许模式从其他名称空间重用模式。
最常使用的模式是http://www.w3.org/2001/XMLSchema
,它定义了像xs:int
和xs:string
这样的内置类型。例如SAML Assertion重用http://www.w3.org/2000/09/xmldsig#
和http://www.w3.org/2001/04/xmlenc#
。
如果每个实例文档在不同的命名空间中定义了xs:int
,那将是非常令人困惑的。像xs
这样的前缀可以由实例指定为任意值,所以如果需要,可以将其称为foo:int
。但验证者需要知道最终它解析为{http://www.w3.org/2001/XMLSchema}int
。
“指定目标名称空间的单个模式(或”词汇表“)的好处是它允许模式从其他名称空间重用模式。”“但验证程序需要知道最终它会解析为{http:///www.w3.org/2001/XMLSchema}int“ 但是,即使Xml命名空间和Xml Schema与a)中描述的方式相关联,也无法实现这两个目标? – user437291 2010-10-21 19:37:01
术语“XML Schema”仅指模式描述语言。个别模式被简单地称为“模式”或“模式”。 – 2010-10-21 17:24:16