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第一个或最后一个,因为如果默认的命名空间设施可用,那么我们可以使用它来做些什么 。
targetNamespace
是schema
元素的一个属性,它定义了名称空间,即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:xsd
和xmlns: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的模式。