2010-12-12 9 views
2

XMLスキーマがあり、いくつかのノードでいくつかの拡張をサポートしたいとします。拡張子は、これらのノード内の有効なXMLである必要があります。未知の要素でXMLを拡張する

これは<の>要素で実装されている可能性があります。しかし私のスキーマを使用する私のXMLでは、この拡張機能は他のXSDのノードだけを使用したいと思っています。したがって、実行時に拡張機能のスキーマを指定し、拡張機能スキーマに対してこの拡張機能を検証できるようにします。


<xs:element name="notes" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any namespace="http://www.w3.org/1999/xhtml" 
      minOccurs="0" maxOccurs="unbounded" 
      processContents="skip"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

は、今私は(初心者I'am)例えば、私のXMLでこのスキーマを、指定したい、このように:


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="myschema.xsd"> 
    <bar> 
    <extension> 
     <html namespace="http://www.w3.org/1999/xhtml"> 
     <body>Hello, World!</body> 
     </html> 
    </extension> 
    </bar> 
</foo> 

次の例では、静的な拡張スキーマを使用しています

これにはどのような方法が最適ですか?理想的には、XMLの拡張ノードで使用するスキーマを自分のXMLにリストしたいと考えています。

ありがとうございます!

==編集、より詳細な説明:==

私は特定のノード内のユーザ定義されたXMLデータをサポートします。私は私の "マスター"スキーマの作成中にこれらの拡張のスキーマを知らない。

私は私のXSDに次のフラグメント指定されている:


<xs:element name="extension"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:any namespace="##other" processContents="strict"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

をそして、次のXMLを使用したい:


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd" > 
    <bar> 
     <extension> 
      <html xmlns="http://www.w3.org/1999/xhtml"> 
       <body2>Hello, world!</body2> 
      </html> 
     </extension> 
    </bar> 
</foo> 

< body2が有効でないため今私は、パーサー・エラーをしたいですかXHTML要素。しかし、XMLSpyパーサはすでに有効でない< html>要素について不平を言っています。

+0

私は間違いを見ることができません! XMLSpyは愚かで、名前空間を切り替えることはできません。しかし... body2はその時点で無効な要素です!あなたが体を取ったらどうしますか? –

+0

私の編集を参照してください。 XMLSpyはhtml要素を拒否する権利があります。スキーマを取得する場所は指定していません。 –

答えて

0

使用「厳格な」処理は、プロセッサがスキーマを取得する可能性が高いことができませんので、任意の要素の内容は、その後、失敗するつまり

<xs:element name="notes" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any namespace="http://www.w3.org/1999/xhtml" 
      minOccurs="0" maxOccurs="unbounded" 
      processContents="strict"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

検証文書の、そのスキーマに対して検証されていることを義務付けますXHTMLの場合あなたがそうのように、また、インスタンス文書でこれを指定する必要があります:彼らはhtml要素にschemaLocation属性を考慮していないので、彼らはべきものの

<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="test.xsd"> 
<extension> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
    xsi:schemaLocation="http://www.w3.org/1999/xhtml 
         http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd"> 
    <body2>Hello, world!</body2> 
    </html> 
</extension> 
</foo> 

を、多くのXSDバリデータはまだ(この上で窒息しますto、per spec)。 schemaLocation属性をルート要素に移動すると、 が改善される可能性があります(またはそうでない可能性があります)。バリデーターがhtml要素について不平を言うと、それが壊れています。

+0

Martinに感謝します。多分私は私の質問で十分に明確ではなかった(または私は答えを理解していない)。私は私の "マスター"スキーマの拡張スキーマを知らないので、最初のフラグメントのように、そのスキーマを静的に定義することはできません。私の最初のトピックを見てください。再度、感謝します! – eiri

+0

優秀!はい、私は今何が間違っているのか理解しています。あなたに助けてくれてありがとう。 – eiri

関連する問題