web-dev-qa-db-ja.com

XMLをXSDにどのようにリンクしますか?

-declarationを使用してXMLをDTDにバインドするのと同じように、XSDでそれをどのように行うのでしょうか。

MSDNサンプル:

<?xml version="1.0"?>
<Product ProductID="123" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Product.xsd">
    <ProductName>Rugby jersey</ProductName>
</Product> 

トリックを行うのはxsi:NoNamespaceSchemaLocationですか?それともこれは別の名前空間ですか?

[編集]そして

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

..lineは、一意のXML名前空間を提供するためだけのものですか、それともスキーマを配置できる場所に関する情報も提供しますか?

21
cwap

schemaLocationを試してください。

<?xml version="1.0"?>

<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

noNamespaceSchemaLocationは異なります。どちらも実際には、XMLドキュメントの利用者にとって、理論的には「ヒント」にすぎないことに注意してください。それらに従わなかったxmlプロセッサーに出くわしたことはありません。結局のところ、これはW3Cの推奨事項です。参照 http://www.w3.org/TR/xmlschema-1/

しかし、実際、それは here のように失敗する可能性がありますが、再び、理由によりバグと見なされます。

短く言えば、私はそれを信頼し、これまでのところ害はありません:-)

最近のXMLプロセッサでは、この「ヒント」を無視できないと思います。

URLは常に一意にするためのものですが、一部の情報はURLの下に提供されます。

19
Peter

xsi:noNamespaceSchemaLocationとxsi:schemaLocationはどちらも、それらのヒントに従うことにしたXMLプロセッサにヒントを提供します。しかし、それらは単なるヒントです。それらは必ずしもあなたの文書をスキーマに照らして検証させるわけではありません。

4
John Saunders

私は通常、名前空間を含めて、処理している人がそれを検証したい場合は、スキーマを取得し、XSDを検出できるように処理環境を設定することを期待しています。 xsi:schemaLocationとそのような属性での成功は限られています。問題のほとんどは、通常、XSDファイル自体の検索に集中しています。一部のプロセッサーは、XSDがWebサーバーではなくファイルシステム上にある場合に多くの楽しみがあるパスを含めたいと考えています。

プロセッサーごとにルックアップの実装が少し異なるようです。個別のスキーマカタログオブジェクトを使用するものもあれば、スキーマを個別にロードしてアタッチする必要があるものもあります。ドキュメントを処理するためのコードを提供するのでない限り、xsi:schemaLocationまたはxsi:noNamespaceSchemaLocation IMHOを含めないことをお勧めします。それらを含めることができる唯一のことは、ドキュメントを処理してスキーマを同じ場所に配置するか、選択したプロセッサに場所の指定を無視または回避する方法を見つけることです。

補足として、私が遭遇した最大の問題は、実際には"c:\somepath\doc.dtd"を参照するSYSTEM宣言を使用して指定されたDTDに関するものでした。問題は、FreeBSDボックスでドキュメントを処理していたことです。ドキュメント自体を変更することはできず、ドキュメントを検証する必要があったため、Windowsスタイルのパスをローカルファイルシステムにマップする独自のリゾルバーを作成することになりました。

3
D.Shawley

ばかげた質問ではありませんが、 John Saundersが正しい です。

-declerationを使用してXMLをDTDにバインドするのと同じように、XSDでそれを行うにはどうすればよいでしょうか。

これが問題の本質です-あなたはできません。 DTDアプローチの問題の1つは、ドキュメントがドキュメントコンシューマーではなく検証メカニズムを指定することでした。 DTD後、XMLドキュメントを取得し、XSDまたはRELAX NGまたはその他のメカニズムで検証できます。これらは分離されています(少なくとも理論的には)。すべてのXSDリンクはヒントであり、オプションです 任意のドキュメントを検証することはできません

3
McDowell