【发布时间】:2012-04-08 20:32:56
【问题描述】:
我想了解在 XML Schema 和 WSDL 中使用的 targetNamespace 的用途。事实上,为了简单起见,让我们把这个问题限制在 XML Schema 上。
我觉得我完全理解(简单)XML 命名空间的概念。按照惯例,我们使用 URI/URL,但我们可以使用任何字符串,然后将其分配给前缀以供 XML 节点和属性重用,或者简单地用作手头范围的默认命名空间。到目前为止,还好吗?
现在进入 XML 模式。出于某种原因,XML Schema 的发明者认为简单命名空间的概念是不够的,他们不得不引入 targetNamespace。我的问题是:targetNamespace 引入了普通 XML 命名空间无法提供的哪些显着优势?如果 XML 文档通过 schemaLocation 或使用 import 语句引用 xsd 文档,无论哪种情况,我都会给出被引用的实际 xsd 文档的路径。这是唯一定义我要引用的模式的内容。另外,如果我想将此 Schema 绑定到我的引用文档中的特定命名空间,为什么我必须复制已经在我引用的 XML Schema 中定义的精确 targetNamespace?为什么我不能在 XML 文档中简单地重新定义这个命名空间,但是我想在其中使用这个命名空间来引用我想要引用的特定 XML Schema 文档?
更新:
举个例子,如果我在一个 XML 实例文档中有以下内容:
<p:Person
xmlns:p="http://contoso.com/People"
xmlns:v="http://contoso.com/Vehicles"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://contoso.com/schemas/Vehicles
http://contoso.com/schemas/vehicles.xsd
http://contoso.com/schemas/People
http://contoso.com/schemas/people.xsd">
<name>John</name>
<age>28</age>
<height>59</height>
<v:Vehicle>
<color>Red</color>
<wheels>4</wheels>
<seats>2</seats>
</v:Vehicle>
</p:Person>
为什么例如people.xsd 架构需要定义一个 targetNamespace,即“http://contoso.com/schemas/People”?为什么我们需要 xsd 文档中的 targetNamespace 定义呢?在我看来,您必须从 schemaLocation 的命名空间部分获得的一切都已包含在 XML 实例文档中。在 xsd 文档中强制存在具有相同值的 targetNamespace 有什么好处?
保罗回答的后续问题:
你能给我一个具体的例子,xsd 元素名称之间的这种“冲突”变得很明显,这可以解释 targetNamespace 的需要吗?
好的,这里尝试回答我自己的问题。让我知道它是否对你来说是连贯的。查看 Paul 链接的页面上的示例对我有帮助。
如果我们以上面原始问题中的 XML 实例为例,我们有两个对车辆元素定义的引用。一个在 XML 实例文档本身中是显式且可见的,但我们还必须想象 person.xsd XML Schema 再次引用相同的车辆定义作为 person 的允许子元素。如果我们使用允许每个文档为车辆定义自己的名称空间的普通名称空间,我们怎么知道 XML 实例引用了与 person.xsd 相同的车辆 XML Schema 定义?唯一的方法是强制执行一个命名空间的概念,它比原来的简单命名空间更严格,并且必须在多个文档中以完全相同的方式编写。
如果我不是在平板电脑上写这篇文章,我会提供一个代码示例,但在这里我将尝试描述我想到的示例。
想象一下,对于一个车辆元素,我们有两个不同的 XML 模式定义。 location1/vehicles.xsd 将包含验证本文问题示例的定义(包含颜色、车轮和座椅子元素),而 location2/vehicles.xsd 将包含一个完全不同的车辆元素定义,(例如, 带有子元素 year、model 和 volume)。现在,如果 XML 实例文档引用 location1 Schema,就像上面的例子一样,但是 person.xsd 说 person 元素可以包含 location2 Schema 中定义的类型的车辆子元素,那么没有这个概念对于 targetNamespace,XML 实例会进行验证,即使它显然没有正确的车辆类型作为其 person 元素的子元素。
然后,目标命名空间帮助我们确保如果两个不同的文档引用相同的第三个 XML Schema,它们实际上都引用了相同的 Schema,而不仅仅是一个包含相似但不相同的元素的 Schema另一个...
这有意义吗?
【问题讨论】:
标签: xml namespaces xsd