2012-01-14 14 views
13
<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 

     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-2.1.xsd"> 

    <context:component-scan 
     base-package="com.springinaction.chapter01.knight" /> 

</beans> 

上記の例は、いくつかの名前空間を持つXMLファイルの例を示しています。これらの名前空間の目的は何ですか?また、最も重要なことに、インターネット接続がない場所でも機能するのはなぜですか?XMLネームスペースのしくみ

xsi:schemaLocationで始まる2番目のビットには、XMLドキュメントの構造を検証するために使用されるXMLスキーマファイルが含まれていると思います。ネットワークに接続されていないマシンでこの設定ファイルを使用するアプリケーションを実行すると、これらの機能はどのように機能しますか? URLは何らかの形でJARファイルの別名ですか?

答えて

14

このXMLドキュメントがあるとします。

<?xml version="1.0" encoding="UTF-8"?> 
<html> 
     <body> 
     Your text here 
     </body> 
     <body> 
     <height>182 cm</height> 
     <weight>83 kg</weight> 
     </body> 
</html> 

HTMLタグには、HTMLレンダラーのセマンティックな意味を持つbodyタグが含まれています。また、特定の人に関する情報を運ぶ別のbodyタグもあります。名前空間は、このタグのセマンティックスコープを定義します。名前空間がない場合(例のように)、パーサは構文的に同じであるため、違いを伝えることはできません。

<?xml version="1.0" encoding="UTF-8"?> 
<html:html xmlns:html="http://www.w3.org/TR/xhtml1/"> 
    <html:body> 
    Your text here 
    </html:body> 
    <human:body xmlns:html="http://www.example.com/human/"> 
    <human:height>182 cm</human:height> 
    <human:weight>83 kg</human:weight> 
    </human:body> 
</html:html> 

したがって、私たちは別の意味でのタグの競合を心配していない名前空間のおかげで:ここで

は、同じ文書の意味的に正しいバージョンがあります。

名前空間URI自体は実際に解決されることはなく、任意です(したがって、それらをオフラインで使用できます)。

+1

名前空間でこのタグを分離するためにユニークな単語を使用しないでください。ありがとうございました – Raghavendra

+0

一部の言語(WPFやxamlなど)では、usingステートメントのような名前空間を使用しています。これが起こると、URLが重要になります。 –

+0

私はそれを取得しません。人間のために定義されたxmlnsはどこですか? ???私には分かりません。 – Mitch

4

XML名前空間は要素名の構成要素であり、xmlns:<prefix>="<namespace>"と記述すると接頭辞にバインドできます。これは、異なるXMLスキーマ間の名前の競合を回避するのに役立ちます。そのため、同じ名前を持つ2つのスキーマの要素を混在させることができます。たとえば、link要素の意味が異なる2つのスキーマがあり、名前空間接頭辞では、foo:linkまたはbar:linkのいずれかを使用して区別することができます。名前空間は通常URLの形式ですが、パーサは文字列として扱いますが、URLから何も取得しようとしません。

2番目の部分については、XSI:SchemaLocation要素が正しいと思います。ネットワーク接続なしでスキーマをまだ検証できる理由については、this answerを参照してください。

+0

XML名前空間は接頭辞ではなく、それを説明するものではないため、混乱の原因となります。名前空間は、通常URLのような文字列です。要素をそのネームスペースにバインドする**接頭辞*を使用することができます。 – Alohci

+0

@Alohciそれを指摘してくれてありがとう、私は接頭辞が名前空間だったことを暗示するつもりはありませんでした。私は2つを区別するために私の答えを編集しました。 – Tony

9

多くの名前空間の名前がブラウザに入力するURLのように見えるという事実を無視してみてください。彼らは文字のランダムな文字列です、彼らはWeb上のリソースのアドレスではありません。人々がこのコンベンションを採用した理由は、誰が名前を所有しているかを示しているからです。つまり、http://www.w3.org/2001/XMLSchemaが名前空間名として "xsd1.0"を選択した場合よりも明確で、間違って他の誰か。また、関連する場所にドキュメントを置くことができますが、XMLソフトウェアはドキュメントを自動的に探しません。

+0

すてきな方ありがとうございます。私は豆のクラスタグを逃した場合、私はJavaで豆の名前空間を使用すると疑いがあります、あなたが逃したようなエラーが表示されます。そのネームスペースは、解決せずにどのように動作しますか?私の英語は良くありません。 – Raghavendra

0

名前空間は一般にタグ間の競合を避けるためのものですが、シーンの背後にはいくつかのスキーマに対するパーサーの処理命令があります。たとえば、Document type、strict Xhtmlなどのブラウザでは、ブラウザにこれらのスキーマが格納されており、パーサーはその構造を検証するためのスキーマを参照します。

Springでは、特定のスキーマを有効にした後、そのスキーマが存在する参照が必要です。つまり、URIスキーマに意味がないわけではありません。関連する.jarファイルがclass-pathに必要となり、パーサーがそれを参照するようになります。 orgorg。springframework.context-4.1.jar。このjarファイルを調べると、spring-context-2.5.xsdファイルが存在するorg.springframework.context.configパッケージが見つかります。 以下を定義します。 xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

のxmlnsがxmlns:contextから来ている例<context tagのために書くために事前設定された手段を使用するようにエディタを使用してあなたを与える、とのような検証タグを可能にします:

<context:annotation-config> 

Beanクラスで検出されるさまざまな注釈をTURNで有効にするもの: @Required @Autowired、@PostConstruct、@P reDestroyと@Resourceなど。

したがって、実際にパーサーはBeanの解析中に意味を見つけます。

スキーマが非常に必要です。あなたのIDEまたはアプリケーションが検証のために使用する少なくとも1つをダウンロードする必要があります。それ以外の場合は検証例外が作成されます。それらのjarファイル内でローカルに利用可能な場合、ダウンロードは検索されません。

関連する問題