2016-04-13 1 views
1

QNameは、名前空間修飾名です。XML QNamesを動的に解決するよりも静的にXML QNamesを解決する方が良いのはなぜですか?

<ac:aircraft xmlns:ac="http://www.aircraft.org"> 
    <ac:altitude>12,000 feet</ac:altitude> 
</ac:aircraft> 

2略記QNamesである:

ac:aircraft 
ac:altitude 

拡張QNamesである:

{http://www.aircraft.org}aircraft 
{http://www.aircraft.org}altitude 

XMLパーサーを省略(短縮名に変換するためのルールを知っているここで含むXML 2 QNamesであります名前)を長い名前(拡張名)に変換します。

名前の省略形は、解析時には長い名前に解決できます。

QNamesもデータに使用できます。次のXMLでは、<log>要素の値がQNameです:

<network-traffic xmlns:network="http://www.network-traffic.org"> 
     <log>network:client-error</log> 
</network-traffic> 

XMLパーサは、マークアップではなく、データ上でのみ動作します。したがって、XMLパーサは短い名前を長い名前に変換しません。短い名前から長い名前へのマッピングは、XSLTプロセッサーやXMLスキーマのバリデーターなどの上位アプリケーションによって行わなければなりません。つまり、短い名前から長い名前の解決は、ではなく、で、静的にはでなければなりません。

質問:短い名前を長い名前に静的に解決する方が良いのはなぜですか?ショートネームをロングネームに動的に解決することの短所は何ですか?短い名前を長い名前に動的に解決しなければならないため、どこで問題が発生するのかという具体的な例を教えてください。 QNameの静的分析にはどのようなメリットがありますか?

+0

なぜあなたは質問をしているのかよくわからないので、役に立ちません。なぜ知りたいのか説明できますか? – kimbert

+0

xml-devのリストMichael Kayは、XML名前空間に関するいくつかの問題を特徴付けました。彼は書いています:短縮形の名前が許されているなら、それは常に長い名前に静的に解決可能でなければなりません。これは、短い名前を長い名前(XMLパーサ)に変換するルールを知っているソフトウェアコンポーネントが短い名前の存在を検出できないため、「コンテンツのQName」の場合には不可能です。それを拡大する。そのため、短い名前から長い名前へのマッピングを、システム内の他のコンポーネントが使用できるようにする必要があります。 ...私はこれをよく理解したいと思います。 –

+0

related:[XMLコンテンツの識別子としての修飾名(QNames)の使用](https://www.w3.org/2001/tag/doc/qnameids-2004-03-17) –

答えて

1

私はマイケルのポイントは、ネームスペースプレフィックスは字句の便宜のために見なければならないと思います。実際の修飾名は、(接頭辞、名前)のペアではなく、(名前空間、名前)のペアです。単一の名前空間は、同じ文書内であっても、複数の異なる接頭辞を使用して表現される場合があります。
区別はしばしば重要ではありません。名前空間のバインディングが利用可能な場合、接頭辞から名前空間に変換するのは簡単です。しかし、開発者の中には、特定の名前空間接頭辞に依存する遅延してコードを書くものがあります。 XML情報セットの一部が他の場所にコピーされると、名前空間バインディングの階層が変更され、その接頭辞の意味も変わる可能性があるため、これは壊れやすい戦略です。これを防ぐために、XML情報セットを処理するアプリケーションは、接頭辞への直接アクセスを提供するAPIを提供すべきではありません(接頭辞から名前空間へのバインディングを操作する場合を除く)。代わりに、情報セットにはすべてのノードの完全な名前空間が含まれている必要があります。 プログラム内からXPathプロセッサーを呼び出したことがある人は、この問題が発生している可能性があります。 XPathは接頭辞を認識しているため、XPath式を実行する前にXPathプロセッサ用の「名前空間コンテキスト」オブジェクトを設定する必要があることがよくあります。そうしないと、XPath式の接頭辞が誤って解釈される可能性があります。

関連する問題