XML校验报错求助:xmlns:xsi声明及codigo格式问题
XML校验错误排查求助
元素类型“pedido”必须声明属性“xmlns:xsi”。[7]
元素类型“pedido”必须声明属性“xsi:noNamespaceSchemaLocation”。[7]
cvc-pattern-valid:值“NOV-2-00003”不符合类型“codigoPedidoType”的正则模式“^(NOV|TEM|PRO)-[0-5]-\d{5}$”。[7]
cvc-attribute.3:元素“pedido”的属性“codigo”的值“NOV-2-00003”不符合其类型“codigoPedidoType”。[7]
XML校验完成。
我遇到了上述XML校验错误,尝试各种方法仍无法定位问题,恳请精通XML/XSD的专业人士帮忙排查。
XML代码
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE pedido SYSTEM "pedido_A.dtd"> <pedido xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="pedido_B.xsd" codigo="NOV-2-00003"> <cliente> <nombre_completo>Paco López</nombre_completo> <usuario>paco23</usuario> <telefono>950202020</telefono> </cliente> <producto stock="no"> <cantidad>1</cantidad> <descripcion>camiseta</descripcion> <precio_unitario moneda="euros">15</precio_unitario> </producto> <envio> <nombre_contacto>Paco López</nombre_contacto> <ubicacion> <via>Plaza Constitución, 5</via> <poblacion codigo_postal="04001">Almería</poblacion> </ubicacion> </envio> </pedido>
XSD代码
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="pedido"> <xs:complexType> <xs:sequence> <xs:element name="cliente" type="clienteType"/> <xs:element name="producto" type="productoType" minOccurs="1" maxOccurs="unbounded"/> <xs:element name="envio" type="envioType" minOccurs="0"/> </xs:sequence> <xs:attribute name="codigo" type="codigoPedidoType" use="required"/> </xs:complexType> <xs:unique name="unique-codigo"> <xs:selector xpath="."/> <xs:field xpath="@codigo"/> </xs:unique> </xs:element> <xs:complexType name="clienteType"> <xs:sequence> <xs:choice> <xs:element name="nombre_completo" type="xs:string" minOccurs="0"/> <xs:element name="razon_social" type="xs:string" minOccurs="0"/> </xs:choice> <xs:element name="usuario" type="xs:string"/> <xs:element name="telefono" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="email" type="xs:string" minOccurs="0"/> </xs:sequence> <xs:attribute name="contrato" use="optional"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="sin_contrato"/> <xs:enumeration value="básico"/> <xs:enumeration value="plus"/> <xs:enumeration value="premium"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> <xs:complexType name="productoType"> <xs:sequence> <xs:element name="cantidad" type="xs:integer"/> <xs:element name="descripcion" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> <xs:element name="precio_unitario" type="precioUnitarioType"/> </xs:sequence> <xs:attribute name="stock" type="xs:string" use="optional" default="sí"/> </xs:complexType> <xs:complexType name="precioUnitarioType"> <xs:simpleContent> <xs:extension base="xs:decimal"> <xs:attribute name="moneda" type="xs:string" use="required" fixed="euros"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="envioType"> <xs:sequence> <xs:element name="nombre_contacto" type="xs:string"/> <xs:element name="ubicacion" type="ubicacionType"/> </xs:sequence> </xs:complexType> <xs:complexType name="ubicacionType"> <xs:sequence> <xs:element name="via" type="xs:string"/> <xs:element name="poblacion" type="poblacionType"/> <xs:element name="provincia" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="poblacionType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="codigo_postal" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:simpleType name="codigoPedidoType"> <xs:restriction base="xs:string"> <xs:pattern value="^(NOV|TEM|PRO)-[0-5]-\d{5}$"/> </xs:restriction> </xs:simpleType> </xs:schema>
问题排查与修复方案
1. 解决xmlns:xsi和xsi:noNamespaceSchemaLocation的错误
你的XML已声明这两个属性,但报错是因为同时引入了DTD和XSD校验。解析器遇到DOCTYPE声明时会优先用DTD校验,而DTD未定义这两个属性,因此抛出错误。
修复:移除XML中的DTD声明行
<!DOCTYPE pedido SYSTEM "pedido_A.dtd">
只保留XSD校验声明,让解析器使用XSD规则校验。
2. 解决codigo属性格式错误
XSD中codigoPedidoType的正则^(NOV|TEM|PRO)-[0-5]-\d{5}$,部分XSD解析器不兼容\d,标准推荐用[0-9]替代。
修复:修改XSD中的正则模式
<xs:pattern value="^(NOV|TEM|PRO)-[0-5]-[0-9]{5}$"/>
同时确认codigo值无隐藏空格或特殊字符,NOV-2-00003本身符合格式要求。
额外检查
- 确保
pedido_B.xsd与XML文件在同一目录,或xsi:noNamespaceSchemaLocation路径正确。 - 确认XML中的特殊字符(如
ñ)编码正常,UTF-8编码下可支持,但需保证解析器编码设置一致。
内容的提问来源于stack exchange,提问作者AntonioMS
相关产品推荐
相关产品推荐

