3

ここで何かが私を混乱させます:

NSXMLParser メソッドには、namespaceURI 属性があります。

- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName

ドキュメントから、「名前空間」が何を意味するのかわかりませんでした。XML の名前空間とは何か、なぜそれが必要なのか、誰かが例を挙げて説明できますか?

編集:はい、ウィキペディアに気づきました。しかし、これまた紛らわしいです。次のように、XML ファイルの先頭に 1 つの名前空間宣言を配置することにどのような意味がありますか?

xmlns:xhtml="http://www.w3.org/1999/xhtml"

?? 繰り返しますが、それはまったく意味がありません。ウィキペディアには、名前空間が本当に必要な理由と、さらに重要なことに、これが XML ファイルでどのように見えるかについて、それを取得するための有用な例がありません。ID のような複数の同じ名前の要素のあいまいさを解決するためだと彼らは言いますが、複数の名前空間がそれを解決する方法の例はありません。

4

4 に答える 4

7

XML 名前空間は、他の場所の名前空間と同じように機能します。

それらは、同じ名前の要素または属性を一意に区別する手段を提供します。これは、名前空間 URI を宣言し、オプションでノード名にプレフィックスを付加することによって行われます。このプレフィックスは、(オプションで) 名前空間宣言と共に定義されます。

<!-- node without any namespace (it's in the default namespace) -->
<node>
  <child /><!-- descendants are in the parent namespace by default -->
</node>

<!-- node with explicit default namespace -->
<node xmlns="http://some/namespace/uri/">
  <child /><!-- descendants are in the parent namespace by default -->
</node>

<!-- NS declaration with prefix (node is still in the default namespace!) -->
<node xmlns:prefix="http://some/namespace/uri/">
  <child /><!-- descendants are in the parent's namespace -->
  <prefix:child><!-- explicit namespace assignment by prefix -->
    <grandchild /><!-- prefixes don't propagate, this is in the default namespace! -->
  </prefix:child>
</node>

名前空間は厳密にスコープされています。ノードとその子孫のみが使用できます。XML ドキュメント全体で名前空間を使用できるようにするには、トップ レベルの要素 (ドキュメント要素) で宣言する必要があります。

あなたの場合、例または<prefix:child />

didEndElement = "child"
 namespaceURI = "http://some/namespace/uri/"
qualifiedName = "prefix:child"
于 2010-02-10T15:40:08.070 に答える
3

http://en.wikipedia.org/wiki/XML_namespaceを参照してください

于 2010-02-10T15:32:15.390 に答える
3

名前空間は要素名を修飾するために使用され、プレフィックスは XML を簡素化するために使用されます。デフォルトでは、URI が「空」の名前空間があります。

Tomalak の例の展開:

<!-- Mixing namespaces default namespace -->
<node xmlns:gc="http://other/namespace/gc"> <!-- node is in default NS -->
  <child> <!-- child is still in default NS, inherited from parent - node -->
    <gc:grandchild/>  <!-- grandchild is in the "http://other/namespace/gc", because of gc prefix -->
  </child>
  <child xmlns="http://some/namespace/uri/" xmlns:gc2="http://other/namespace/gc"> <!-- node is in "http://home/namespace/uri" because of declration -->
    <gc2:grandchild/> <!-- again, in "http://other/namespace/gc", despite different prefix -->
    <grandchild/> <!-- yet this one is in "http://home/namespace/uri", no prefix, inherited from parent -->
  </child>
</node>

ここで重要なのは、両方の「子」ノードが異なるノードであることです。それらは同じように見えますが、「完全修飾名」が異なります」。これは、XSL では特に重要です。

孫も同じ。gc:grandchild と gc2:grandchild は同じです。同じ名前空間 URI を共有しますが、異なるプレフィックスを使用します。3 番目の孫ノードは、親子ノードから継承された名前空間を使用しているため、異なります。

名前空間は、さまざまなボキャブラリーの xml を 1 つのドキュメントに「組み合わせて一致させる」ことができるため、重要です。たとえば、XHTML ドキュメント内への SVG マークアップの埋め込み。名前空間を使用すると、同じベース ノード名の重複を防ぐことができます。

ほとんどの単純な XML の問題では、それらは不要です。しかし、標準などをマージし始めると、それらは非常に重要になります。

もう 1 つの例は、Web サービスの SOAP エンベロープ内に SAML アサーションを埋め込むことです。SOAP は 1 つの標準であり、SAML は別の標準です。独立した標準と標準化団体ですが、どちらも「任意の XML」の領域をドキュメントに挿入できます。名前空間はコンテンツを分離します。

于 2010-02-10T16:38:56.763 に答える
1

同じ xml 階層に同じローカル名を持つノードが存在する可能性があるため、名前空間は XML で重要です。

雑誌の記事を記述する xml ドキュメントを想像してみてください。記事の著者を定義する要素があるかもしれません:

<article>
  <head>
    <author>Emily Berthenstien</author>
  </head>
....

記事のさらに下には、引用された著者を一覧表示する引用がある場合があります。

<citations>
  <citation>
    <author>Bernard Rightofen</author>
  </citation>  
</citations>       

2 つの「作成者」ノードをどのように区別しますか?

head と citation ノードの「author」要素に別の名前空間を追加すると、作成者ノードごとにQNameが作成され、それを使用して (XPath などを使用して) 具体的にアクセスし、混乱することはありません。たとえば、XPath とその QName を使用して、引用の著者のみを選択できるようになりました。

declare namespace citauths="http://citation/authors/only"

//citauths:author

そして記事の著者だけ:

declare namespace auths="http://article/authors/only"

//auths:author
于 2010-02-10T16:41:01.267 に答える