2011-08-25 18 views
58

xmlスキーマ文書で、targetNamespaceとxmlns の両方があり、接頭辞なしの場合はです。接頭辞なしのtargetNamespaceとxmlnsの違いは何ですか?

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

正確な違いは何ですか?私の理解は、プレフィックスのないxmlnsがある場合、プレフィックスのないすべての要素がその名前空間を取得し、...同じことがtargetNamespaceに紛らわしいということです。

+0

私はこのテーマについてのある程度の知識が不足しているかもしれませんが、答えはちょうどすることができませんでした:のxmlnsは、デフォルトの名前空間でありますこのドキュメント(スキーマドキュメント)のtargetNamespaceは、このスキーマドキュメントが検証する名前空間です。そして、このようにしてxmlnsとtargetNamespaceは2つの異なるものですか? – Vering

+0

あなたの最初の文章と私のテスト結果が一致しています。はい、targetNamespaceは、スキーマが検証するドキュメントを参照しています。 targetNamespaceの存在には、 'xmlns'または 'xmlns:xxx'のいずれかが存在する必要もあります。実際には、多くの 'xmlns:xxx'、 'xmlns:yyy'、 'xmlns'を組み合わせて使用​​することができます。 – ifelsemonkey

答えて

67

targetNamespaceはXMLスキーマの "アーティファクト"です。その目的:スキーマファイルがどのような特定のXML名前空間を示すかを示すこと。

xmlns - XMLスキーマはXMLドキュメントであるため、XMLファイル自体にデフォルトのXML名前空間を定義することができます(これはxmlns属性の機能です)。含意は複数です:オーサリングと構成。たとえば、スキーマで定義された項目の接頭辞を使用する必要はなく、後で同じファイル内の別の場所(たとえば、属性または要素の型として使用されるグローバル・シンプル・タイプ)で参照されます。

私の経験から、多くのXMLスキーマの作者は、これを「ベストプラクティス」と考えています。正しい方向に進んでいます。

XSDの場合、targetNamespaceは、要素、属性、グループ、属性グループ、単純型および複合型を含むスキーマコンポーネントの修飾名の名前空間部分を規定しています。 XSD(要素と属性)で定義された修飾名の中には、XMLインスタンス文書で「直接」使用されるものがあります。型のような他のものは、インスタンスXML文書のxsi:type属性で参照できます。残り(グループ、属性グループ)はスキーマの構成を容易にするためのものです(参照による)。既存のXMLに一致するように

  • :私は(一般的に)人という意見もよ

    は二つの角度からXSDを設計に来ます。この場合、XMLが名前空間を使用する場合、それぞれの名前空間に対して、targetNamespace属性が一致するXSDスキーマ要素が使用されます。

  • 純粋なモデリング。 targetNamespaceは、UMLパッケージ、データベーススキーマ、Javaパッケージ、.NETの名前空間などと似ていますが、この場合はすべて意味します。基本的には、名前の衝突を避けるためのメカニズムです。それにもかかわらず、それはなど、また

13

のxmlns

のxmlns属性が記述要素の既定の名前空間を設定し、対象エリア内のモデルを分割するための機構です。したがって、既定の名前空間は、記述された要素内のすべての要素に適用され、明示的に別の名前空間を宣言しません。デフォルトの名前空間はWSDLファイルの標準値に設定されている

targetNameSpaceとhttp://www.w3.org/ns/wsdl

この属性は、Webサービスの名前空間が含まれています。この名前空間は自由に選択できますが、URIがサービスのWSDLを指すようにするという規則があります。

のxmlns:TNS

この名前空間はtargetNamespace属性と同じURIに設定する必要があります。こうすることで、この名前空間接頭辞(tns)を使用してターゲットの名前空間を参照できます。

出典:まだ混乱している人のためにhttp://tutorials.jenkov.com/wsdl/description.html

14

、これら三つのXSDを考えてみましょう。それらはすべて、それを参照する1つのグローバルタイプと1つのグローバルエレメント定義を定義します。

まず、上記のようなxsd。今、同じXSD

<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」とのtargetNamespaceのためのデフォルトの名前空間を使用しています

<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> 

場合ので、スキーマ作者のほとんどは、最初か最後を選択してくださいデフォルトのネームスペース機能が利用可能な場合は、の何かのために使用するかもしれません。

-1

いくつかの徹底的なテストの後にxmllint私はここで明確な説明を見つけたと思う。以下のスキーマを考えてみましょう:

<?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> 

上記のスキーマは、以下の文書を検証します:自動的に結合するのxmlns =「http://yyyzzz.com」ために動作理由がある

<?xml version="1.0"?> 

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

要素はスキーマによっても定義されています。つまり、recipeType要素にもバインドされています。今

、また検証し、違いをよく見とる以下のように同じXMLドキュメントではなく、わずかに変更されたスキーマを持つ:他ののxmlnsが行方不明になっている場合

<?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> 

は無視し、代わりをよく見ますtype = "EGboy:recipeType"。私たちは、もはやそれは、したがって、異なる値を持っているので、我々はrecipeTypeの前でEGboyプレフィックスを置く必要がありますのxmlnsに頼ることはできません。

XMLドキュメントも、この接頭辞はスキーマが多く存在する場合には、適切なのxmlnsを参照するだけのためであるEGboyプレフィックスの気にしません。

2

targetNamespaceの属性はschemaであり、要素はXSDファイル内の名前空間、つまりパッケージを定義します。規約ではURI/URLを使用していますが、任意の文字列を使用できます。

xmlns属性は、現在の要素スコープのxmlns属性値に由来する要素およびデータ型を参照するために使用されます。例については

:P = "のhttp://www.example xsdは、名前空間接頭辞なしxsd:

  • xmlns="http://www.w3.org/2001/XMLSchema"接頭辞すべきであることを意味して

    • xmlns:xsd="http://www.w3.org/2001/XMLSchema"はデフォルト
    • のxmlnsをある接頭辞です。 com/People "の接頭辞がpの場合、名前空間の接頭辞は、p:

    xmlns:xsdxmlns:pはQNameで、xmlnsはローカル名です。

    以下の画像は、私の知識に従ってJavaのアナロジーを使用してXSDを理解するのに役立ちます:

    enter image description here

  • 関連する問題