2017-11-15 14 views
1

要素がxs:anyTypeの次のXMLスキーマを持つ。xsd:anyType要素の検証を無効にする

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="payloadAny" type="xs:anyType"/>     
      </xs:sequence> 
     </xs:complexType>   
    </xs:element> 
</xs:schema> 

XMLのどれ例:要素にXSIあるとき

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <payloadAny> 
     <anything>anyContent</anything> 
    </payloadAny> 
</root> 

現在、問題を発見し、このようなタイプ属性:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <payloadAny> 
     <anything xsi:type="ForeignType">anyContent</anything> 
    </payloadAny> 
</root> 

このXMLを持ちますxsi:type属性は、xs:anyTyp要素を持つXMLスキーマに対してもはや検証されません。

E [Xerces] cvc-elt.4.2: 'foreignType'を要素 'anything'の型定義に解決できません。代わりに<element type="xs:anyType"/><xs:any/>要素を使用している場合

、検証がのprocessContents属性を使用して無効にすることができます。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:complexType name="any"> 
     <xs:sequence> 
      <xs:any processContents="skip"/> 
     </xs:sequence> 
    </xs:complexType>  
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="payloadAny" type="any"/>     
      </xs:sequence> 
     </xs:complexType>   
    </xs:element> 
</xs:schema> 

質問は今、次のとおりです。

なぜ <xs:any/><element type="xs:anyType"/> でこのような違いがあるどのように xs:anyType要素で xsi:type検証を無効にする( processContents="skipのような)
  • 答えて

    2

    あなたのスキーマで定義されている要素と型構造のxs:anyType要素(のようなprocessContents="skip"

    xsi:type検証、スキーマプロセッサによるxsi:type属性の検証は無効にすることはできません。 xsi:typeの宣言は、すべての適合するXSDスキーマバリデータに組み込まれており、属性がxsi:typeの要素が厳密にまたはゆるやかに検証されると、その宣言が検出され、xsi:type属性が検証されます。有効なxsi:type属性には、スキーマの型定義を識別するQName値があります。 QName値がタイプ定義を識別しない場合、その属性は無効です。

    報告しているエラーメッセージから、スキーマには展開名が{}ForeignTypeの型が含まれていないように見えます。それを回避するために

    一つの方法は、あなたが本当にxs:anyTypeないpayloadAny要素、のためにしたいように見えるタイプが、skipワイルドカードとは異なるタイプを宣言するだろう。 2番目のスキーマの例では、多くの要素と文字データを許可するのではなく、{}anyの型がxs:anyTypeと異なり、1つの要素の子のみを許可しています。 (1つの要素を子としてpayloadAnyにする場合は、xs:anyTypeが緩すぎます。)報告されたエラーが、それはローカルで有効な制約要素の節4.2に違反しているためxsi:type属性は、それ自体が無効であることをanything要素がタイプForeignTypeに対して無効であるという主張が、レポートではないことを

    注意。その結果、payloadAnyが無効になります。

    スキーマ文書のXSDスキーマ1.0に示す次の宣言で宣言されたかのようになぜ<xs:any/><element type="xs:anyType"/>

    内蔵型xs:anyType振る舞う(おおよそ)におけるこのような差があります。

    <xs:complexType name="anyType" mixed="true"> 
        <xs:annotation> 
        <xs:documentation> 
         Not the real urType, but as close an approximation as we can 
         get in the XML representation</xs:documentation> 
        </xs:annotation> 
        <xs:sequence> 
        <xs:any minOccurs="0" 
          maxOccurs="unbounded" 
          processContents="lax"/> 
        </xs:sequence> 
        <xs:anyAttribute processContents="lax"/> 
    

    何のパラメータ化mechaniはありませんprocessContentsに類似した複合型の場合はsms、その他の属性の場合はxs:anyです。 xs:anyTypeのためにそのようなメカニズムを追加すると、追加のアドホックメカニズムが必要になります(XSDは十分に複雑ではありませんか?もっと欲しいですか?)。

    設計上の決定が進むにつれて、それはかなり簡単に思えるように見えます。 XMLスキーマワーキンググループ(決して懐疑的な臨機応変な機械については決して考えない)でさえ、このような専用機械は不要だと考えていました。

    属性文法で構築されたスキーマ言語では、継承された属性が要素および/または型をパラメータ化することができるため、このような機械は言語の自然な部分であり、lax/strict/skip処理のパラメータが理にかなっています。しかし、広く使用されているXSDも他のスキーマ言語も属性文法に基づいて構築されていません。

    関連する問題