使用XML模式限制嵌套在父元素中的子元素的深度是否可能?限制XSD中嵌套元素的深度
這裏的上下文是我從管理系統收集警報,我想提供一個XML文檔,它允許最終用戶定義一些規則,以便將警報過濾到UI中的文件夾中。我想限制嵌套文件夾的深度爲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模式,因爲由於許可考慮,我無法添加支持RELAX/Schematron所需的第三方庫(Java應用程序)。我可能最終不得不編寫一些非常不雅的代碼來支持這一點,即使架構解決方案很混亂,也可能是兩個弊端中較小的一個。 – tja 2010-09-03 12:37:40
@tja看到更新:) – 2010-09-03 15:21:23
完美,我把你的觀點放在優雅(或缺乏)上。 – tja 2010-09-03 16:24:34