XML汽车数据库XSD验证问题:元素属性与子元素定义错误
问题解决方案
核心问题分析
numero属性位置错误:XSD中你把numero属性定义在了根元素coches上,但XML里却将其放在coche元素上,导致验证报错。revision元素无法重复使用:当前XSD中revision元素默认仅能出现一次,无法添加多条维修记录。
修正后的XSD代码
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="coches"> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="coche" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="marca" type="xs:string"></xs:element> <xs:element name="modelo" type="xs:string"></xs:element> <xs:element name="anio" type="anio"></xs:element> <xs:element name="color" type="xs:string"></xs:element> <xs:element name="precio"> <xs:complexType> <xs:simpleContent> <xs:extension base="precio"> <xs:attribute name="moneda" type="moneda" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="potencia" type="xs:string"></xs:element> <xs:element name="combustible" type="combustible"></xs:element> <xs:element name="transmision" type="transmision"></xs:element> <xs:element name="kilometraje" type="kilometraje"></xs:element> <xs:element name="revisiones"> <xs:complexType> <xs:sequence> <!-- 允许多个revision元素 --> <xs:element name="revision" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="observaciones" type="xs:string"></xs:element> </xs:sequence> <xs:attribute name="fecha" type="xs:string" use="required"></xs:attribute> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <!-- 将numero属性移到coche元素的complexType下 --> <xs:attribute name="numero" type="xs:integer"></xs:attribute> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:simpleType name="anio"> <xs:restriction base="xs:integer"> <xs:minInclusive value="1950" /> <xs:maxInclusive value="2025" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="moneda"> <xs:restriction base="xs:string"> <xs:enumeration value="EUR" /> <xs:enumeration value="USD" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="combustible"> <xs:restriction base="xs:string"> <xs:enumeration value="Gasolina" /> <xs:enumeration value="GLP" /> <xs:enumeration value="Diesel" /> <xs:enumeration value="hibrido" /> <xs:enumeration value="electrico" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="transmision"> <xs:restriction base="xs:string"> <xs:enumeration value="Manual" /> <xs:enumeration value="Automático" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="kilometraje"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="precio"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"></xs:minInclusive> </xs:restriction> </xs:simpleType> </xs:schema>
关键修改说明
- 调整
numero属性位置:将原本属于coches元素的numero属性移动到coche元素的xs:complexType节点下,使XML中coche元素的numero属性能被正确识别。 - 允许多个
revision元素:在xs:element name="revision"标签中添加maxOccurs="unbounded",让<revisiones>节点下可包含任意数量的<revision>子元素。
验证后的XML示例(支持多条维修记录)
<?xml version="1.0" encoding="UTF-8"?> <coches xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="coches.xsd"> <coche numero="1"> <marca>Audi</marca> <modelo>A1 8X</modelo> <anio>2010</anio> <color>negro brillante</color> <precio moneda="EUR">8600</precio> <potencia>105</potencia> <combustible>Gasolina</combustible> <transmision>Manual</transmision> <kilometraje>101001</kilometraje> <revisiones> <revision fecha="21/01/2025"> <observaciones>Retrovisor roto y luz trasera fundida</observaciones> </revision> <revision fecha="15/03/2025"> <observaciones>Cambio de aceite y filtro</observaciones> </revision> </revisiones> </coche> </coches>
内容的提问来源于stack exchange,提问作者Cristina García
相关产品推荐
相关产品推荐

