-1

要素を作成し、何度かDOMDocument呼び出します。appendChild()

XML の構築が完了したら、XSD スキーマに対して検証したいと考えています。

$newDocument->schemaValidate($schemaPath);

エラーが出ました

No matching global declaration available for the validation root. 

しかし、生成された XML をファイルに保存した場合は、それを開いて、すべて問題ないことを確認します。または、次のような場合:

$newDocument->loadXML($newDocument->saveXML());

その後、すべてが順調です。

最初のケースでバリデーターがルート要素を見つけられない理由を説明できますか?

アップデート

xml の作成方法:

$newDocument = new DOMDocument();

$rootElement = $newDocument->createElement('ONIXMessage');

$rootElement->setAttribute('xmlns', 'http://www.editeur.org/onix/2.1/reference');

$newDocument->appendChild($rootElement);

子をルート要素に追加した後、XML スキーマに対して検証しようとすると、リストされたコードでもエラーが発生します。

xml スキーマ ファイルについて。私は EDITEUR 組織からダウンロードしたので、問題は私の側にあると思います。サイトhttp://www.editeur.org/onix/2.1/reference/ONIX_BookProduct_Release2.1_reference.xsdの .xsd ファイルへのリンク

4

2 に答える 2

1

私の知る限り、libxml の一部の古いバージョンでこの問題に遭遇する人がいますが、これは要素が作成される名前空間に関連しています。

たぶん、スキーマファイルと同じ NS を指定して、単純な(そして)createElementNS()の代わりに要素を作成しようとすることができます。createElementappendChild

于 2013-03-04T18:39:06.103 に答える
0

createElementNS代わりに使用する必要があると思いますcreateElement-つまり:

$newDocument = new DOMDocument();
$rootElement = $newDocument->createElementNS('http://www.editeur.org/onix/2.1/reference', 'ONIXMessage');
$newDocument->appendChild($rootElement);

何が起こっているかというとDOMDocument、メモリ内のルート要素が null 名前空間にあるため、検証に失敗しますが、名前空間宣言があります。そのため、保存して再ロードすると、ルート要素は正しい名前空間になり、検証が機能します。

于 2013-03-05T15:16:57.560 に答える