You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:12:04