是否可以使用 XML模式来限制嵌套在父级中的子元素的深度? 这里的上下文是我从管理系统收集警报,我想提供一个XML文档,允许最终用户定义一些规则,以便将警报过滤到UI中的文件夹.我
这里的上下文是我从管理系统收集警报,我想提供一个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 Schema中没有一个非常简单的解决方案(但是在其他语言中),但实际上你可以通过自己嵌套整个东西来实现它,我不建议这样做.所以,如果我是你,我会做两件事之一:
>选择XML Schema(或扩展)的替代方案请参阅:http://en.wikipedia.org/wiki/XML_schema#XML_schema_languages(看一下RELAX和Schematron)
>在您的应用程序中进行深度检查,如果深度> gt,则拒绝它. 3,并在XML Schema和应用程序的文档中明确行为.
关于XML Schema 1.1版(候选推荐)的Wiki引用:
通过XPath 2.0表达式(从Schematron借来的想法)定义文档内容的断言的能力
< - 这将使深度很容易定义. 有关如何在XMLSchema中表示嵌套深度的注释: 基本上你可以做类似以下的事情(仍然建议在代码中执行).然后添加属性,调整深度等(您可以重用具有扩展名或限制的属性,但我不是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>