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

Abe*_*Abe 71 xml schema xsd prefix xml-namespaces

在xml架构文档中,如果我同时拥有targetNamespace和没有前缀的xmlns .

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://example.com/" xmlns="http://example.com/">
Run Code Online (Sandbox Code Playgroud)

它们之间的确切区别是什么?我的理解是,如果你有一个没有前缀的xmlns,那么没有前缀的所有元素都会得到那个名称空间,并且......对于targetNamespace来说,这一点令人困惑.

Pet*_*dea 76

targetNamespace是一个XML Schema"artifact"; 其目的:指示模式文件描述的特定XML名称空间.

xmlns - 因为XML Schema是一个XML文档,因此可以为XML文件本身定义一个默认的XML命名空间(这是xmlns属性所做的); 影响是多重的:创作和作曲.例如,一个人不必为模式中定义的项使用前缀,稍后在同一文件中的其他位置引用(例如,用作属性或元素的类型的全局simpleType).

根据我的经验,许多XML Schema作者认为这是"最佳实践"......所以你走在正确的轨道上.

就XSD而言,targetNamespace规定了模式组件的限定名称的名称空间部分,其中包括元素,属性,组和属性组以及简单和复杂类型.XSD(元素和属性)中定义的某些限定名称由XML实例文档"直接"使用.其他(例如类型)可以通过实例XML文档中的xsi:type属性引用.其余的(组,属性组)用于促进模式组合(通过引用).

我也认为(一般来说)人们从两个角度来设计XSD:

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

  • 纯粹的建模.然后,您可以将targetNamespace视为类似于UML包,数据库模式,Java包或.NET命名空间,在这种情况下它就意味着.从根本上说,它是一种避免命名冲突的机制; 尽管如此,它也是一种在主题领域划分模型等的机制.


kim*_*ert 21

对于仍然困惑的人,请考虑这三个xsds.它们都定义了一个全局类型和一个引用它的全局元素定义.

首先,xsd就像上面发布的一样.它使用前缀'xsd'作为模式名称空间,并使用targetNamespace的默认名称空间:

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

  <xsd:element name="aGlobalElement" type="aGlobalType"/>

  <xsd:simpleType name="aGlobalType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>   
</xsd:schema>  
Run Code Online (Sandbox Code Playgroud)

现在是相同的xsd,但为目标命名空间定义和使用名称空间前缀:

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

  <xsd:element name="aGlobalElement" type="tns:aGlobalType"/>

  <xsd:simpleType name="aGlobalType">
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType> 
</xsd:schema>  
Run Code Online (Sandbox Code Playgroud)

...最后,对XML架构命名空间使用默认命名空间而不是'xsd'的版本:

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

  <element name="aGlobalElement" type="tns:aGlobalType"/>

  <simpleType name="aGlobalType">
    <restriction base="string"/>
  </simpleType>
</schema>
Run Code Online (Sandbox Code Playgroud)

大多数模式作者选择第一个或最后一个,因为如果默认命名空间工具可用,那么我们也可以将它用于某些东西.


Hak*_*ata 14

XMLNS

xmlns属性设置所描述元素的默认名称空间.因此,默认名称空间应用于所描述元素内的所有元素,这些元素不会为自己显式声明另一个名称空间.

默认名称空间设置为WSDL文件的标准值:http://www.w3.org/ns/wsdl

目标名称

此属性包含Web服务的名称空间.您可以自由选择此名称空间,但有一个约定,即URI应指向服务的WSDL.

的xmlns:TNS

此名称空间应设置为与targetNameSpace属性相同的URI.这样,您可以通过此名称空间前缀(tns)引用目标名称空间.

资料来源:http://tutorials.jenkov.com/wsdl/description.html

  • targetNamespace 的 URI 并不“指向”任何东西——它只是命名空间的标识符。它可能是 Web 服务的 URI,但它仍然只是用于标记名称空间。 (2认同)

Pre*_*raj 5

命名空间意味着像范围

targetNamespaceschema元素的一个属性,定义了命名空间,即 XSD 文件中的包。按照惯例,我们使用 URI/URL,但我们可以使用任何字符串。

xmlns 是一个属性,用于引用来自当前元素范围的 xmlns 属性值的元素和数据类型。

例如:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema"is with prefix asxsd意味着命名空间应该以xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" 没有前缀是默认的
  • xmlns:p="http://www.example.com/People" 带有前缀,p表示命名空间应该带有前缀p:

其中xmlns:xsdxmlns:p是 QNames 并且xmlns是本地名称。

根据我的知识,下图有助于使用 Java 类比来理解 XSD:

在此处输入图片说明