4

ページw3schools は、スキーマ宣言の 1 つの形式として次を提供します。

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">
...
...
</xs:schema>

ここ、

targetNamespaceは、定義されている XML ドキュメントの名前空間を定義します。つまり、"this" XSD で定義されている XML ドキュメントで使用できるタグ (要素) と属性です。

xmlns=http://www.w3schools.com/schema/schema_schema.asp

一方、XML ドキュメント内の名前のデフォルトの名前空間を定義しています。つまり、「この」XSD(?) で定義されていない名前であるため、パーサーは最初にtargetNamespaceで宣言された名前空間を検索します。そこに名前が見つからない場合は、次に進み、xmlnsの名前を試します (?)

上記のスキーマ宣言でtargetNamespace属性をスキップすると、正確には何が見落とされますか? 私はxmlnsを持っていますが、targetNamespaceは同じ名前空間を参照しているため冗長です。

私は何が欠けていますか?

注: XML の " xmlns " とはどういう意味ですか? 他のいくつかの議論の中で。

4

3 に答える 3

14

targetNamespaceとの違いを理解するにはxmlns、次のように考えてください。

XSDは、XML スキーマを記述するための言語です。どのようなコンピューター言語も何らかの方法で表現する必要があります。つまり、いくつかの演算子、キーワード セットが必要です。これらはすべて文法と呼ばれます。

XSD (つまり W3C) の作成者は、別の文法を発明するのではなく、そのために XML 自体を使用することを決定しました。したがって、XSD は XML で表現されます。XMLはそのキャリアです。

本質的に、それは一種の偶然です。これは、XSD の作成者が利便性のために選択したものです (そして、その利便性は実際に存在します!)。しかし、それは必須要件ではありません。たとえば、XML に基づいていないRELAX NGと呼ばれる別の XML スキーマ言語があります。

しかし、XML がすべての XSD テキストのキャリアになると、XML 固有のものに対処しなければならなくなりますxmlns。基本的に、指定された XML ファイルの要素にデフォルトの名前空間を割り当てます。そのファイルにたまたま記述されている XML スキーマとは何の関係もありません。これは、その XML ファイルの規則にすぎません (内容に関係なく)。

targetNamespace逆に は XSD 言語そのもののことです。スキーマによって記述された XML 要素が属する名前空間を指定します。

targetNamespaceとIndeed の間には冗長性がありxmlnsます。しかし、それらの 1 つを排除するためにそれを使用 (利用) する方法はありません。これを考えてください:

XML は、XML パーサーによって解析され、別のもの ( XML infoset など)に変換されます。このようなパーサーは、XSD について何も知る必要はなく、その出力は XML にはなりません。そのため、すべての XML 固有のもの (xmlns名前空間プレフィックスなど) が失われます。

次に、その情報セット (またはその他のもの) が XSD プロセッサに渡され、新たに開始され、必要なすべての情報が手元にある必要があります。したがって、targetNamespaceその XML スキーマのターゲット名前空間についてそれを伝える唯一のものになります!

于 2013-08-27T22:25:47.357 に答える
4

targetNamespace とデフォルトの名前空間宣言 ( ) の違いは、xmlns=...2 つの単純な例を検討するとより明確になる場合があります。初め:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://example.com/ns"
           xmlns:tns="http://example.com/ns"
           xmlns:ns2="http://example.com/ns2"
           elementFormDefault="qualified">

   <xs:import namespace="http://example.com/ns2"/>

   <xs:complexType name="T1"/>
   <xs:element name="doc" type="tns:T1"/>
   <xs:element name="note" type="ns2:T1"/>
</xs:schema>

複雑なことは何もありません。スキーマ ドキュメントでは、1 つの複合型と 2 つの要素が宣言されており、すべてターゲット名前空間http://example.com/nsにあります。それらは名前空間にあるため、要素宣言または型定義のいずれかを参照するドキュメントは、名前空間で修飾された名前を使用する必要があります。

2 つの要素宣言はそれぞれ型を参照します。両方のタイプのローカル名は T1 ですが、名前空間が異なるため、修飾名 tns:T1 と ns2:T1 は異なります。

2 番目の例では、まったく同じ要素と型を宣言していますが、宣言でわずかに異なる XML 構文を使用しています。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://example.com/ns"
           xmlns="http://example.com/ns"
           xmlns:ns2="http://example.com/ns2"
           elementFormDefault="qualified">

   <xs:import namespace="http://example.com/ns2"/>

   <xs:complexType name="T1"/>
   <xs:element name="doc" type="T1"/>
   <xs:element name="note" type="ns2:T1"/>
</xs:schema>

唯一の違いは、名前空間http://example.com/nsdocがデフォルトの名前空間として (xmlns="http://example.com/ns" を使用して) 宣言されていることです。その名前空間の型 T1 を参照してください。

デフォルトの名前空間はhttp://example.com/ns2 -- または (@forty-two が提供する例の 1 つに示されているように) http://www.w3.org/2001/にするのと同じくらい簡単に作成できます。 XMLスキーマ

これら 2 つの例がどのように機能するかを理解すると、targetNamespace 属性とデフォルトの名前空間宣言が互いにどのように関連するか (およびその理由) が理解できます。

于 2013-08-28T01:46:52.913 に答える