web-dev-qa-db-ja.com

プレフィックスなしの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についても同じことです。

70
Abe

targetNamespaceはXMLスキーマの「アーティファクト」です。その目的:スキーマファイルが記述する特定のXML名前空間を示すため。

xmlns-XMLスキーマはXMLドキュメントであるため、XMLファイル自体のデフォルトのXML名前空間を定義することができます(これがxmlns属性ですする);意味は複数あります:オーサリングと構成。たとえば、スキーマで定義されたアイテムのプレフィックスを使用する必要はありません。同じファイルの他の場所で後で参照されます(たとえば、属性または要素のタイプとして使用されるグローバルなsimpleType)。

私の経験から、多くのXMLスキーマ作成者はこれを「ベストプラクティス」と考えています...あなたは正しい道を歩んでいます。

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

また、(一般的に)XSDの設計には2つの角度から人々が参加しているという意見もあります。

  • 既存のXMLと一致します。この場合、XMLが名前空間を使用している場合、使用されている各名前空間について、一致するtargetNamespace属性を持つXSDスキーマ要素になります。

  • 純粋なモデリング。その後、targetNamespaceをUMLパッケージ、データベーススキーマ、またはJavaパッケージ、または.NET名前空間に似ています。この場合はすべて意味します。基本的には回避するメカニズムです。衝突の命名;それにもかかわらず、サブジェクト領域などでモデルを分割するメカニズムでもあります。

76
Petru Gardea

まだ混乱している人のために、これらの3つのxsdsを検討してください。これらはすべて、1つのグローバルタイプと、それを参照する1つのグローバル要素定義を定義します。

まず、上記のような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>

ほとんどのスキーマ作成者は最初または最後を選択します。これは、デフォルトのネームスペース機能が使用可能な場合、somethingにも使用できるためです。

19
kimbert

xmlns

Xmlns属性は、記述された要素のデフォルトの名前空間を設定します。したがって、既定の名前空間は、説明された要素内のすべての要素に適用されます。これらの要素は、別の名前空間を明示的に宣言しません。

デフォルトの名前空間は、WSDLファイルの標準値に設定されます。 http://www.w3.org/ns/wsdl

targetNameSpace

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

xmlns:tns

この名前空間は、targetNameSpace属性と同じURIに設定する必要があります。そうすれば、この名前空間プレフィックス(tns)を介してターゲット名前空間を参照できます。

ソース: http://tutorials.jenkov.com/wsdl/description.html

14
HakunaMatata

名前空間はscopeのような意味

targetNamespaceschema要素の属性であり、名前空間、つまりXSDファイルのパッケージを定義します。慣例により、URI/URLを使用しますが、任意の文字列を使用できます。

xmlnsは、現在の要素スコープのxmlns属性値に由来する要素とデータ型を参照するために使用される属性です。

例えば:

  • 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はQNameであり、xmlnsはローカル名です。

次の画像は、私の知識によるとJavaの類推を使用してXSDを理解するのに役立ちます。

enter image description here

3
Premraj

他の答えはここで良いので、ここではそれらの説明を繰り返しません。ただし、Java backgroundからの誰かが、よりシンプルなものを見つけた場合、ここで私が思いついた類推があります-

  1. _.xsd_ドキュメントは成果物/ _.jar_ファイルです
  2. xmlns

    _package com.example
    _

    ステートメント、Javaクラスの先頭で宣言します。

たとえば、Javaプロジェクトに単一のパッケージがあり、すべてのクラスが単一の外部クラス]内で宣言および定義されている場合

_    package com.furniture.models

    public class FurnitureShop {

         int noOfTables;
         int noOfChairs;
         int noOfBeds;
         List<Table> tables;
         List<Chair> chairs;
         List<Bed> beds;

         // and now instead of declaring and defining a class for table/chair/bed in a 
         // separate file, you just add it here 
         public static class Table {
             int height;
             int width;
             int length;
             ...
         }

         public static class Chair {
             String color;
             ChairType chairType;
             ...
         }

         public static class Sofa {
             int price;
             String color;
             ...
         }
    }
_

これは、新しいスキーマのために、さまざまな要素が単一の_.xsd_ファイルにグループ化される方法です。

  1. targetNamespaceは、作成するアーティファクトの名前ですcreate。自分でわかるように、スキーマを作成するときにtargetNamespaceが使用されます.xsd_ファイル。

アーティファクト(または_.xsd_ファイル)が作成されたら、次のように他のプロジェクトで使用します-

Javaプロジェクトでは、次のように_pom.xml_(または_build.gradle_)ファイルを使用してライブラリをインポートします-

_    <dependency>
       <groupId>com.furniture</groupId>
       <artifactId>furniture-apis</artifactId>
       <version>1.1.1</version>
    </dependency>
_

XMLでは、次を使用してスキーマを「インポート」します

_    <furniture xmlns="http://furniture.com"/>
_

===付録===

明確化-

  1. xmlnsは、packageステートメントとしても、Javaのimportステートメントとしても使用されます。 _.xsd_ファイルでは、xmlnsは「package」ステートメントとして機能しますが、_.xml_ファイルでは「import」ステートメントとして機能します。
1
Akshayraj Kore