XML模式是否可以限制嵌套在父模式中的子元素的深度?
这里的上下文是我从管理系统收集警报,我想提供一个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>
任何指针都非常赞赏!
答案 0 :(得分:4)
XML Schema中没有一个非常简单的解决方案(但是在其他语言中),但实际上你可以通过自己嵌套整个事物来推荐它。
所以,如果我是你,我会做两件事之一:
depth > 3
时拒绝它,并在XML Schema和应用程序的文档中明确行为。引用Wiki关于XML Schema 1.1版(候选推荐):
通过XPath 2.0表达式(从Schematron借来的想法)定义文档内容断言的能力
&lt; - 这将使深度很容易定义。
有关如何在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>