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

在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 Schema“神器”; 其目的是:指出模式文件描述的特定XML名称空间。

xmlns – 因为XML Schema是一个XML文档,所以可以为XML文件本身定义一个默认的XML名称空间(这是xmlns属性的作用)。 影响是多重的:创作和构图。 例如,不必为在模式中定义的项目使用前缀,稍后在同一文件中的其他地方(例如用作属性或元素的types的全局简单types)引用它们。

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

就XSD而言,targetNamespace规定模式组件的限定名称的名称空间部分,其中包括元素,属性,组和属性组以及简单和复杂types。 一些XSD中定义的限定名(元素和属性)是由XML实例文档“直接”使用的。 其他的,比如types,可以通过实例XML文档中的xsi:type属性来引用。 其余的(组,属性组)在那里以方便模式组合(通过引用)。

我也认为(一般来说)人们从两个angular度来deviseXSD:

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

  • 纯粹的造型。 然后,您会想到与UML包,数据库模式,Java包或.NET命名空间类似的targetNamespace,在这种情况下意味着这一切。 从根本上说,这是一种避免命名冲突的机制。 尽pipe如此,它也是一个在主题领域划分模型的机制。

XMLNS

xmlns属性设置所描述的元素的默认名称空间。 默认名称空间因此被应用于所描述的元素内的所有元素,其不明确地为他们自己声明另一个名称空间。

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

目标名称

该属性包含您的Web服务的名称空间。 您可以自由select这个名称空间,但有一个惯例说URI应该指向服务的WSDL。

的xmlns:TNS

这个名称空间应该设置为与targetNameSpace属性相同的URI。 这样你可以通过这个名字空间前缀(tns)来引用目标名字空间。

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

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

首先,像上面发布的一个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> 

现在是相同的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> 

…最后,为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> 

大多数架构作者select第一个或最后一个,因为如果默认的命名空间设施可用,那么我们可以使用它来做些什么

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

xmlns是一个属性,用于引用来自当前元素作用域的xmlns属性值的元素和数据types。

例如:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema"带有前缀,因为xsd表示命名空间应该以xsd:
  • 没有前缀的xmlns="http://www.w3.org/2001/XMLSchema"是默认的
  • xmlns:p =“http://www.example.com/People”带有前缀,因为;p表示命名空间应该以p:

其中xmlns:xsdxmlns:p是QNames,而xmlns是本地名称。

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

在这里输入图像说明

在使用xmllint进行了一些彻底的testing后,我想我在这里find了明确的解释。 考虑下面的模式:

 <?xml version="1.0" encoding="utf-8"?> <xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://yyyzzz.com" xmlns:p="http://abced.com" xmlns:q="http://pqr.com" xmlns="http://yyyzzz.com"> <xsd:element name="recipe" type="recipeType" /> <xsd:complexType name="recipeType"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="desc" type="xsd:string" /> <xsd:attribute name="archetype" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:schema> 

上面的模式validation到以下文件:

 <?xml version="1.0"?> <recipe xmlns="http://yyyzzz.com"> Deciphering the purpose of targetNamespace </recipe> 

原因是因为xmlns =“http://yyyzzz.com”;自动绑定到架构定义的元素! 这意味着,它也绑定到recipeType元素。

现在,使用相同的XML文档,但稍微修改架构如下也validation和仔细看看不同之处:

 <?xml version="1.0" encoding="utf-8"?> <xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://yyyzzz.com" xmlns="http://eigenfield.aparicio.com" xmlns:EGboy="http://yyyzzz.com"> <xsd:element name="recipe" type="EGboy:recipeType" /> <xsd:complexType name="recipeType"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="desc" type="xsd:string" /> <xsd:attribute name="archetype" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:schema> 

忽略其他xmlns不见了,但仔细看看type =“EGboy:recipeType” 。 我们不能再依靠xmlns,因为它具有不同的值,所以我们必须把前缀EGboy放在recipeType的前面。

xml文档甚至不关心EGboy前缀,这个前缀只适用于在有很多情况下引用正确的xmlns的模式。