5

XMLを取得して返すAPIのテストを自動化するために取り組んでいるので、APIの文書化された戻りデータを可能な限りスキーマに変換したいと思います。使いやすさと学習のしやすさに基づいて、このタスクにRelaxNGを選択しました。

すべての情報を投入する前に、次の質問があります。

「名前は同じで属性が異なる、順序付けられていない要素のセット」を説明することはできますか?

これが私が説明するのに苦労しているもののサンプルオブジェクトです:

<item>
    <id>d395136e-d060-4a6e-887c-c0337dd7ad09</id>
    <name>The item has a name</name>
    <link rel="self" type="type1" href="url" />
    <link rel="download" type="type2" href="url" />
    <link rel="relatedData" type="type3" href="url" />
</item>

リンクオブジェクトは、私がハングアップしているビットです。ここに問題があります:

  • アイテム内の要素の順序は保証されていないため、すべての要素を<interleave>構造化しようとしています。
  • 内部には複数の<link>要素があり<item>、属性のセットが異なります(つまり、<item>有効にするには、「self」リンク、「download」リンク、および「relatedData」リンクが必要です)。
  • 各リンクタイプの1つが必要ですが、ここでも順序は保証されません。

私は次のようにスキーマを記述しようとしました:

<element name="item">
    <interleave>
        <element name="id"><text/></element>
        <element name="name"><text/></element>
        <ref name="selfLink"/>
        <ref name="launchLink"/>
        <ref name="thumbnailLink"/>
    </interleave>
</element>

'link'参照は、次のように他の場所で定義されています。

 <define name="selfLink">
 <element name="link">
     <attribute name="href"><text/></attribute>
     <attribute name="rel"><value>self</value></attribute>
     <attribute name="type"><value>type1</value></attribute>
 </element>
 </define>

パーサーはこれに満足していません-jingから私は得error: the element "link" can occur in more than one operand of "interleave"ます。何が起こっているのかはわかりますが、「同じ名前で属性が異なる要素」というアイデアをユニークなアイテムとして処理できることを望んでいました。

リンク参照をインターリーブから移動すると解析されますが、返されたデータの順序が変わるたびにバリデーターが爆発するのを待ちます。

何かアイデアはありますか、それともこれは不可能ですか?私が処理しているXMLに固有の問題があり、これの一部をテストアプリケーションのより高い処理ロジックに移動する必要があります(より一般的なXML検証を実行した後、各リンクタイプを手動で確認しますか?)

4

2 に答える 2

3

RELAXNGのインターリーブの制限に遭遇したようです。私はこれをSchematronで、またはおそらくRELAXNGとSchematronの組み合わせで実行しようとします。

これは、Jingでサポートされ<link>ているバージョンのSchematronを使用して要素をチェックするスニペットです。

<schema xmlns="http://www.ascc.net/xml/schematron">
  <pattern name="link pattern">
    <rule context="item">
      <assert test='count(link) = 3'>There must be 3 link elements.</assert>
      <assert test="count(link[@rel = 'self' and @type ='type1']) = 1">There must be 1 link element wwhere @rel='self' and @type='type1'.</assert>
      <assert test="count(link[@rel = 'download' and @type ='type2']) = 1">There must be 1 link element where @rel='download' and @type='type2'.</assert>
      <assert test="count(link[@rel = 'relatedData' and @type = 'type3']) = 1">There must be 1 link element where @rel='relatedData' and @type='type3'.</assert>
    </rule>
  </pattern>
</schema>
于 2012-08-08T19:19:14.940 に答える
1

次のスキーマが役立つかどうかを確認します

<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
    <element name="item">
        <interleave>
            <element name="id"><text/>
            </element>
            <element name="name"><text/></element>
            <oneOrMore>
                <ref name="link"/>
            </oneOrMore>
        </interleave>
    </element>
</start>

<define name="link">
    <element name="link">
        <attribute name="href"/>
        <choice>
            <group>
                <attribute name="rel"><value>self</value></attribute>
                <attribute name="type"><value>type1</value></attribute>
            </group>
            <group>
                <attribute name="rel"><value>download</value></attribute>
                <attribute name="type"><value>type2</value></attribute>
            </group>
            <group>
                <attribute name="rel"><value>relatedData</value></attribute>
                <attribute name="type"><value>type3</value></attribute>
            </group>
        </choice>
    </element>
</define>
</grammar>
于 2012-08-03T22:03:33.587 に答える