XSDのネストされた要素の深さを制限します
質問
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>
どんなポインターも感謝しています!
解決
XMLスキーマでは、きれいでシンプルなソリューションは利用できません(ただし、他の言語です)が、実際には、私がお勧めできないすべてのものを自分でネストすることでできます。
だから、もし私があなただったら、私は2つのことのいずれかをします:
- XMLスキーマ(または拡張機能)の代替品を選択してください。 http://en.wikipedia.org/wiki/xml_schema#xml_schema_languages (リラックスとスキーマトロンを見てください)
- アプリケーションをチェックして深さを確認して、それを拒否します
depth > 3
XMLスキーマとアプリケーションのドキュメントで動作を明確にします。
XMLスキーマバージョン1.1に関するWikiからの引用(候補者の推奨):
Xpath 2.0式(Schematronから借用したアイデア)を使用して、ドキュメントコンテンツに対するアサーションを定義する機能
< - これにより、定義が非常に簡単に深さが行われます。
xmlschemaの巣の深さを表現する方法についてのコメントについて:
基本的に、次のようなことができます(まだコードで行うことをお勧めします)。次に、属性を追加し、深さの調整などを追加します(属性を再利用できる場合があります extension
また 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>