如何编写XSD验证含固定顺序重复同名元素的XML并解决报错?
解决XSD中同名元素重复出现且保留顺序的验证问题
你遇到的错误根源在于:原XSD中给两个<car>元素同时指定了type="carType",又内嵌定义了复杂类型,导致同名元素被关联了两种冲突的类型定义;同时错误地将xs:complexType的name属性写在了<vehicles>的complexType节点内,不符合XSD的语法规则。
以下是符合需求的正确XSD写法,既能验证指定顺序的XML结构,又能支持自定义属性:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <!-- 定义可复用的car元素类型,支持文本内容+可选属性 --> <xs:complexType name="carType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="newAttribute" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> <!-- 定义可复用的train元素类型 --> <xs:complexType name="trainType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="newAttribute" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> <!-- 根元素vehicles的结构定义 --> <xs:element name="vehicles"> <xs:complexType> <xs:sequence> <!-- 按XML顺序声明元素,两个car使用同一种类型 --> <xs:element name="car" type="carType"/> <xs:element name="train" type="trainType"/> <xs:element name="car" type="carType"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
说明
- 单独抽离
carType和trainType作为可复用类型,避免重复定义,同时保证同名元素的类型一致,解决报错问题。 - 使用
simpleContent扩展字符串类型,既支持元素内的文本内容(如honda、amtrak),又能添加自定义属性newAttribute。 - 严格按照目标XML的元素顺序在
xs:sequence中声明节点,满足顺序保留的需求。
如果不需要自定义属性,仅验证文本内容的简化写法:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="vehicles"> <xs:complexType> <xs:sequence> <xs:element name="car" type="xs:string"/> <xs:element name="train" type="xs:string"/> <xs:element name="car" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
内容的提问来源于stack exchange,提问作者n718an
相关产品推荐
相关产品推荐

