2016-04-12 8 views
2

別のXSDにインポートされたXSDに対して自分のXMLを検証しようとしています。インポートしたXSDに対して検証できません

次のコードを見てください:

xml1.xml:

<e1 xmlns="n1" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="n2 main.xsd"> 
</e1> 

をxsd1.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="n1" 
     elementFormDefault="qualified"> 
<xsd:element name="e1"/> 
</xsd:schema> 

main.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="n2" 
     elementFormDefault="qualified"> 

<xsd:import namespace = "n1" schemaLocation = "xsd1.xsd"/> 
</xsd:schema> 

(XMLツールまたはJavaでNetBeansで)xml1.xmlの検証単にスロー:

cvc-elt.1: Cannot find the declaration of element 'e1'. [3] 

何が問題だろうか?

答えて

2

xsi:schemaLocationのモデルは調整が必要です。 XSCFが自動的に有効範囲に入るインクルードステートメントではありません。検証によって適切なXSDが見つかる可能性がある特定の名前空間について言うとヒントです。

あなたが宣言し、xsi:schemaLocation="n2 main.xsd"、あなたはn2名前空間のmain.xsdに探すためにほのめかしているが、あなたが実際にあなたのルート要素に関連付けられているn1空間について何も言わなかったしました。検証は、n1名前空間のルート要素に遭遇したあなたのヒントを調べ、何を見つけていない、あなたは知ってみましょう:

cvc-elt.1: Cannot find the declaration of element 'e1'. [3] 

それが必要として。あなたのパスが前方に明確である:

xsi:schemaLocation="n2 main.xsd n1 xsd1.xsd" 

をして、XMLドキュメントが正常に検証します:あなたのルート要素の名前空間n1のためのヒントを追加します。

+0

ありがとうございました!私は、主なスキーマにxsd1スキーマをインポートしたので、インポートされた名前空間が含まれているので、メインのみを参照するだけで十分だと思いました。私はそれがこのように動作しないことを認識し始めたが、私は、インポートされた名前空間を接頭辞にバインドし、メインのスキーマで使用する必要があります。私はあなたの答えが良かったと確信しています。 – user1856926

関連する問題