XSDスキーマがありますが、2つの可能な場所に配置する必要があります。1つは開発用(つまり、PC用、もう1つは本番用)です。
これを行うための簡単なメカニズムはありますか?たとえば、開発のXMLは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<Request xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dev.example.com/ Request.xsd">
<GetLocations />
</Request>
と生産
<?xml version="1.0" encoding="utf-8"?>
<Request xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/ Request.xsd">
<GetLocations />
</Request>
これは、XSDで回線を有効にするためです <xs:include schemaLocation="DataTypes.xsd" />
正しいファイルを取得します。
ADDEMDUM
例を挙げましょう
PHPを使用するとします file_get_contents
XMLファイルを取得します。 XSDファイルに対して(HTTP経由で)チェックしたい。そのファイルには <xs:include schemaLocation="DataTypes.xdf" />
。 PHPスクリプトは、このファイルをどこからフェッチするかをどのように認識しますか?
そしてもっとあります
私は次のことをしています
$xml = file_get_contents(<URL FOR XML FILE>);
$xsd = file_get_contents(<URL FOR XSD FILE>);
// The XSD has the include bit in it
$request = new DOMDocument();
$request->loadXML($xml, LIBXML_NOBLANKS);
file_put_contents(<some temporary filename>, $xsd);
if (!$request->schemaValidate(<some temporary filename>))
{
etc...
問題は、XSDファイルが正しいものを取得していることを確認する方法です include
ファイル。スキーマのコピーが2つあります。 1つは本番用で、もう1つは追加のものを追加しています。
回答:
回答№1は0私の知識によると..
この:
$xml = file_get_contents(<URL FOR XML FILE>);
$xsd = file_get_contents(<URL FOR XSD FILE>);
.............
...........
file_put_contents(<some temporary filename>, $xsd);
if (!$request->schemaValidate(<some temporary filename>))
これをオーバーライドします:
<Request xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/ Request.xsd">
そしてについて
XSDファイルが正しいインクルードファイルを取得していることを確認する方法
で呼び出されるXSDファイルのファイルパス/ URLをチェックおよび検証するための既成の方法はありません。 schemaValidate
。私が提案したいのは、開発環境ですばやくテストすることです(念のため)。
次の2つの場所に異なるコピーを保管してください。
location1:XMLが選択されるサーバーパス。1つのXSDがそこに存在します。
location2:スクリプトで明示的に指定されたXSDパス。2番目のパスはここにあります。
1つは(意図的な)不正なコードで、もう1つは検証に合格した通常のコードである必要があります。
XMLを解析し、エラーをチェックします。不正なコードは明らかにエラーをスローします。
2つのXSDファイルを同じように交換します。
これにより、どちらが役割を果たしているかがわかります:)
それが役に立てば幸い..
更新:
私のasp.netサイトでテストしました。これが私の調査結果です。
ストリーム入力としてXMLを渡しました:
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns="http://www.example.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/ Request.xsd">
<branch>data</branch>
</root>
XSDもそうだった:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.example.com/xml" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="branch" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
検証は次のエラーで失敗します:
Cannot load the schema for the namespace "http://www.example.com/" - Could not find file "c:windowssystem32inetsrvRequest.xsd".. Line: 1 Column:40
それで、それは探しています Request.xsd
これはで指定されています schemaLocation
。相対パス(c:windowssystem32inetsrv
)はサービスの実行元です。
お役に立てれば..
回答№2の場合は3
の動作を説明する schemaLocation
:It(XML)は、(完全なファイルパス/ URLを指定していない限り)同じフォルダーにあるXSDファイルとペアになります。これで、XSDファイルがどこからロードされているかがわかりました。
あなたの例では、XMLをXMLでロードする場合パーサー、schemaLocationが登場します。ここで、各ペアの最初のURI参照は名前空間名であり、2番目はその名前空間を記述するスキーマの場所です。
XMLをDocとしてロードし、フルパスを指定するXSDファイルに対して検証する場合、 schemaLocation
オーバーライドされます。
答え№3の2
import要素はincludeと同じように機能します素子。ただし、import要素を使用すると、異なるターゲット名前空間に属する可能性のある同じ/複数のスキーマからコンポーネントにアクセスできます。 構文は次のとおりです。
<import id="ID" namespace="namespace" schemalocation="filename"/>
include要素は、特定のアドレスにある外部スキーマをインクルードまたは参照するために使用されます。 構文は次のとおりです。
<include id="ID" schemaLocation="anyURI" any attributes/>
include要素を使用すると、任意の要素を参照できます同じターゲット名前空間のコンテキストで定義されている外部スキーマ。スキーマのターゲット名前空間は、schema要素のtargetNamespace属性を使用して宣言されます。包含スキーマと連結スキーマのターゲット名前空間が同じであるため、include要素にnamespace属性は必要ありません。
schemaloactionの動作は、@ infantpro "aravind"によってすでに説明されています。
回答№4の場合は1
PHPスクリプトは、xsdファイルを解析して、 schemaLocation
属性。これは、存在する場合と存在しない場合があります。 それは完全にオプションです.
スキーマを別のスキーマにインポートすると、スキーマへのパスを提供する必要はありません。ほとんどのXSDバリデーターは、importステートメントに一致する名前空間を持つxsdファイルを同じ/サブフォルダーで検索します。 schemaLocation属性を完全に無視する人もいます。
回答№5の場合は1
スキーマが同じままの場合は、パブリックロケーションでホストし、相対URIではなく絶対URIを指定すると、誰でもそこで見つけることができます。
スキーマが変更された場合(あなたはあなたがスキーマの開発バージョンに「余分なもの」を追加しますか?どのようなものですか?)XMLスキーマのバージョン管理の問題を見ています。スキーマを見つけることができるというだけではありません。を参照してください。 xmlスキーマのバージョン管理に関するこのドキュメント いくつかの推奨事項について。