2

あるサーバーで空の値が検証に失敗するという問題が少しありますが、他のすべてのサーバーでは機能します。この問題は新しい PHP バージョン (5.3.8) で発生し、少し古いバージョン (5.2.4) で動作します。

失敗するいくつかの孤立した要素を次に示します。

XML 入力:

<clbburnfuelbias></clbburnfuelbias>
<clbburntimebias></clbburntimebias>

XSD 検証:

  <xs:element name="clbburnfuelbias"  type="data-fuelbias"/>
  <xs:element name="clbburntimebias"  type="data-timebias"/>

  <xs:simpleType name="data-fuelbias">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-9900"/>
      <xs:maxInclusive value="9900"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="data-timebias">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-59"/>
      <xs:maxInclusive value="59"/>
    </xs:restriction>
  </xs:simpleType>

エラー:

エラー 1824: 要素 'clbburnfuelbias': 値は、アトミック タイプ 'data-fuelbias' の有効な値ではありません。エラー 1824: 要素 'clbburntimebias': 値は、アトミック タイプ
'data-timebias' の有効な値ではありません。

5.2.4 を実行している別のサーバーでまったく同じ入力ファイルと XSD ファイルを使用しても、エラーは発生せず、xml は有効です。

要素に minOccurs="0" を追加しようとしましたが、 nullable="true" も指定しようとしましたが、それでもエラーが発生します。

アップデート:

私のサーバーでは、PHP 5.2.4 を使用すると null 値が無視され、5.3.8 を使用すると拒否されるようです。提案された私が使用した回避策は、2 つの定義の和集合を使用することです。1 つは整数型用で、もう 1 つは null 値用です。

XSD:

<xs:element name="clbburnfuelbias" minOccurs="0">
  <xs:simpleType>
    <xs:union memberTypes="data-fuelbias null-string"/>
  </xs:simpleType>
</xs:element>

<xs:simpleType name="data-fuelbias">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="-9900"/>
    <xs:maxInclusive value="9900"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="null-string">
  <xs:restriction base="xs:string">
    <xs:length value="0"/>
  </xs:restriction>
</xs:simpleType>
4

3 に答える 3

5

要素をオプション ( minOccurs="0") にしても、その内容はワイルドカードにはなりません。要素が表示される場合は、宣言された型と一致する必要があります。

要素を nillable ( ) にすると、属性nillable="true"がある場合に要素を空にすることができます。xsi:nil="true"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

<clbburnfuelbias xsi:nil="true"></clbburnfuelbias>
<clbburntimebias xsi:nil="true"></clbburntimebias>

検証目的でのみ同じ意味を持つ共用体型を使用することもできます。

<xs:simpleType name="data-fuelbias">
  <xs:union>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-9900"/>
      <xs:maxInclusive value="9900"/>
    </xs:restriction>
    <xs:restriction base="xs:string">
      <xs:length value="0"/>
    </xs:restriction>
  </xs:union>
</xs:simpleType>
于 2012-11-05T18:05:24.163 に答える
3

古いバージョンの PHP にはバグがあったようですが、その後修正されました。これらの要素インスタンスは明らかに無効です。

整数を含むか何も含まない要素の単純な型を定義する私の好みの方法は、itemType=integer、minLength=0、maxLength=1 でリスト型を定義することです。私がユニオン型よりもこちらを好む主な理由は、スキーマを認識する XSLT および XQuery でのほうがうまく機能するからです。また、一部のデータ バインディング製品ではより適切に機能する場合があります。

于 2012-11-05T19:43:57.037 に答える
2

データは、XSDで指定した値の間の整数である必要があります。空の値を渡しています。少なくとも...それが検証すべき方法です。渡すXMLはスキーマに従って検証されるべきではないと思います。

たぶん、XMLパーサーのバージョンはPHPのバージョン間で異なり、古いバージョンは寛容でした。いずれにせよ、私はそのスキーマを次のように読んでいます。2つのフィールドは1回だけ存在し、xとyの間の整数を含む必要があります(xとyはminInclusiveとmaxInclusiveで指定されます)。空の値は検証に失敗するはずです。

于 2012-11-05T18:00:22.203 に答える