2

私は XSD スキーマを持っていますが、2 つの可能な場所に配置する必要があります。

これを行う簡単なメカニズムはありますか。開発の例では、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" />正しいファイルを取得できるようにするためです。

補遺

for をやってみましょう

PHPfile_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 つは追加のものを追加するためのものです。

4

5 に答える 5

3

の動作の説明schemaLocation: It(XML) は、同じフォルダーに存在する XSD ファイルとペアになります (完全なファイルパス/URL を指定していない場合)。これで、XSD ファイルがどこからロードされているかがわかります。

この例では、XML パーサーによって XML をロードすると、schemaLocation が表示されます。各ペアの最初の URI 参照は名前空間名であり、2 番目はその名前空間を説明するスキーマの場所です。

XML を Doc としてロードし、フル パスを指定して XSD ファイルに対して検証すると、schemaLocation上書きされます。

于 2013-01-16T11:44:13.347 に答える
2

import 要素は include 要素と同じように機能します。ただし、インポート要素を使用すると、異なるターゲット名前空間に属する可能性のある同じ/複数のスキーマからコンポーネントにアクセスできます。構文は次のとおりです。

<import id="ID" namespace="namespace" schemalocation="filename"/>

include 要素は、特定のアドレスにある外部スキーマをインクルードまたは参照するために使用されます。構文は次のとおりです。

<include id="ID" schemaLocation="anyURI" any attributes/>

include 要素を使用すると、同じターゲット名前空間のコンテキストで定義されている外部スキーマを参照できます。スキーマのターゲット名前空間は、スキーマ要素の targetNamespace 属性を使用して宣言されます。含まれているスキーマと含まれているスキーマのターゲット名前空間が同じであるため、include 要素に namespace 属性は必要ありません。

schemaloaction の動作は、@infantpro'aravind' によって既に説明されています

于 2013-02-24T12:24:36.197 に答える
1

schemaLocationPHP スクリプトは、属性を探して xsd ファイルを解析しない限り、インクルードがどこにあるかを認識しません。

スキーマを別のスキーマにインポートする場合、スキーマへのパスを指定する必要はありません。ほとんどの XSD バリデーターは、インポート ステートメントと一致する名前空間を持つ任意の xsd ファイルを同じ/サブフォルダーで検索します。schemaLocation 属性を完全に無視するものもあります。

于 2013-01-14T07:53:45.600 に答える
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 パス。

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:\windows\system32\inetsrv\Request.xsd\'.. Line: 1 Column:40

Request.xsdということで、 で指定されているものを探していますschemaLocation。相対パス ( c:\windows\system32\inetsrv\) は、サービスの実行元です。

お役に立てれば..

于 2013-02-25T08:07:31.887 に答える