我有一个通过XML传输的对象层次结构。通过声明哪个元素可以包含哪些子元素,可以在XML Schema中轻松表达层次结构规则。 XML数据的一个简化示例是(实际对象数据包含在属性中,为简洁起见省略):
<root>
<channel>
<router>
<message />
<message />
<message />
</router>
<router>
<message />
<message />
</router>
</channel>
<channel></channel>
</root>
现在我想介绍“文件夹”,i。即只用于构造长子列表以便于使用的节点。如果我创建一个通用<folder>
元素,它不会强加自己的规则,而是从树上的下一个非文件夹元素继承它们。
在我看来,我无法在XSD中表达,或者我可以吗?
我可以想到替代方案,比如为每个可能的规则(丑陋)设置特定的文件夹元素,简单地忽略XSD中的规则并在代码中执行它们(对我来说很好)或以某种方式分离XML中的对象层次结构和中间节点(不太确定如何)。如果您有任何意见,我也非常感谢您对此的评论。
答案 0 :(得分:1)
你是对的,你想要的东西不能在XSD中表达。但是,有可能引入单级文件夹,或者更一般地说是n级文件夹,但不是任意递归的文件夹(因为那些必须是全局元素,然后它们不知道它们包含在哪个中) )。
可以在Schematron中表达这样的约束;反过来,可以将schematron约束嵌入XSD appinfo元素中。您的验证器可能支持也可能不支持嵌入在XSD中的Schematron。