4

親にネストされた子要素の深さをXMLスキーマで制限することは可能ですか?

ここでのコンテキストは、管理システムからアラームを収集し、UI でアラームをフォルダーにフィルター処理するためにエンド ユーザーがいくつかのルールを定義できるようにする XML ドキュメントを提供したいということです。ネストされたフォルダーの深さを 3 に制限して、エンド ユーザーが何百ものレベルをネストできないようにしたいと考えています。非常に多くのレベルにフィルター処理すると、最終的にアプリケーションがクラッシュするためです。

これを処理するコードを書くこともできますが、可能であればスキーマでこれを定義するのが適切だと思われます。

たとえば、これは問題ありません。

<group name="Folder 1">
        <group name="Folder 2">
            <group name="Folder 3">
                <group name="Folder 4">
                </group>
            </group>
        </group>
    </group>

フォルダ 5 は深すぎるため、これは無効です。

<group name="Folder 1">
        <group name="Folder 2">
            <group name="Folder 3">
                <group name="Folder 4">
                    <group name="Folder 5">
                    </group>
                </group>
            </group>
        </group>
    </group>

私のスキーマは次のようになりますが、上記のスニペットの深さを制限していません。

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

  <xs:element name="hierarchy">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="group" type="GroupType" />
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" />
    </xs:complexType>
  </xs:element>

  <xs:complexType name="GroupType">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="group" type="GroupType" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
    <xs:attribute name="filterOn" type="xs:string" use="optional" />
    <xs:attribute name="operator" type="xs:string" use="optional" />
    <xs:attribute name="value" type="xs:string" use="optional" />
  </xs:complexType>
</xs:schema>

どんなポインタでも大歓迎です!

4

1 に答える 1

4

XML スキーマではきれいでシンプルな解決策は利用できませんが (ただし、他の言語では利用できます)、すべてを自分でネストすることで実際に解決できますが、これはお勧めできません。

だから、もし私があなただったら、私は2つのことのうちの1つをします:

  1. XML スキーマ (または拡張機能) の代替案を選択してください: http://en.wikipedia.org/wiki/XML_schema#XML_schema_languages (RELAX と Schematron を見てください)
  2. アプリケーションで深さのチェックをdepth > 3行い、そうでない場合は拒否し、XML スキーマとアプリケーションのドキュメントで動作を明確にします。

XML スキーマ バージョン 1.1 に関する Wiki からの引用 (推奨候補):

XPath 2.0 式を使用してドキュメント コンテンツに対するアサーションを定義する機能 (Schematron から借用したアイデア)

<- これにより、深さを非常に簡単に定義できます。

XMLSchema でネストの深さを表す方法についてのコメント:

基本的には、次のようなことができます (コードで行うことをお勧めします)。extension次に、属性を追加したり、深さを調整したりします (属性をorで再利用できるかもしれませrestrictんが、100% 確信はありません)。複数の種類のサブ要素を許可すると、このメソッドは非常に厄介な (指数関数的) になる可能性があります。

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://somenamespace.com"
           xmlns="http://somenamespace.com">

  <xs:element name="hierarchy">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="group" type="GroupTypeDepth0" />
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" />
    </xs:complexType>
  </xs:element>

  <xs:complexType name="GroupTypeDepth0">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="group" type="GroupTypeDepth1" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="GroupTypeDepth1">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="group" type="GroupTypeDepth2" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="GroupTypeDepth2"/>
</xs:schema>

有効:

<hierarchy xmlns="http://somenamespace.com">
  <group>
    <group>
      <group/>
    </group>
  </group>
</hierarchy>

無効:

<hierarchy xmlns="http://somenamespace.com">
  <group>
    <group>
      <group>
        <group/>
      </group>
    </group>
  </group>
</hierarchy>
于 2010-09-02T19:04:16.497 に答える