在XSD中定义带属性的复杂类型遇到顺序问题求助
为什么调整
<attribute>的位置后XSD才生效? 这个问题其实是XSD语法里一个很容易踩的小坑——它对<complexType>内部组件的编写顺序有严格的强制要求!
在XSD的规范里,定义复杂类型的时候,组件必须按照「先子元素结构(比如<sequence>/<choice>/<all>这类定义子元素的容器),再属性(<attribute>),最后可选的<anyAttribute>」的顺序来写,完全不能颠倒。
你最开始的代码里,把<attribute name="id"/>放在了<sequence>前面,这直接违反了XSD的语法规则,解析器会判定这个XSD是无效的;而当你把属性定义移到<sequence>之后,就完全符合了规范要求,自然就能正常生效了。
举个直观的对比:
错误的顺序(会报错)
<complexType> <attribute name="id"/> <sequence> <element name="Item" minOccurs="0" maxOccurs="unbounded"> </element> </sequence> </complexType>
正确的顺序(可正常解析)
<complexType> <sequence> <element name="Item" minOccurs="0" maxOccurs="unbounded"> </element> </sequence> <attribute name="id"/> </complexType>
简单理解的话,XSD解析器处理复杂类型时,需要先明确这个类型包含哪些子元素结构,再去读取它的属性信息,这个顺序是规范硬性规定的,没什么讨价还价的余地~
内容的提问来源于stack exchange,提问作者More Than Five
相关产品推荐
相关产品推荐

