entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Caracteres no permitidos en la restricción pattern de XML Schema

Estoy definiendo una serie de ficheros XML a través de XSD (XML Schemas). En uno de los campos quiero poner las siguientes restricciones:

  • Tipo string
  • Longitud mínima
  • Longitud máxima
  • Sólo admitir ciertos caracteres

Este ejemplo me ha funcionado perfectamente:

<xs:element name="codigo">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]*"/>
            <xs:minLength value="1"/>
            <xs:maxLength value="10"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

Sin embargo, ahora quiero aplicar las restricciones que indican en esta página para campos alfanuméricos: Página oficial de la AEAT.

He comprobado que el siguiente patrón de Regular Expressions funciona adecuadamente:

[A-Z0-9 ÑÇ´ÁÉÍÓÚ',&:;_\-\.]*

Sin embargo, no puedo poner ese patrón dentro del XSD porque debido a los caracteres que contiene da el error de que el XSD es imposible de parsear.
Código que falla:

<xs:element name="nombre">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z0-9 ÑÇ´ÁÉÍÓÚ',&:;_\-\.]*"/>
            <xs:minLength value="1"/>
            <xs:maxLength value="10"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

Estoy buscando una manera de poner ese patrón u otro que tenga un comportamiento similar.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Carlos!

malditos caracteres raros para los sajones... parece que el error lo da el &. Este schema me está validando en el navegador (FF29):

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:element name="Libro">
         <xsd:complexType>
            <xsd:sequence>
                 <xsd:element name="Título" type="xsd:string"/>
                 <xsd:element name="Autores" type="xsd:string" maxOccurs="10"/>
                 <xsd:element name="Editorial" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="precio" type="xsd:double"/>
        </xsd:complexType>
   </xsd:element>
    <xsd:element name="nombre">
    <xsd:simpleType>
        <xsd:restriction base="xs:string">
            <xsd:pattern value="[A-Z0-9 ÑÇ´ÁÉÍÓÚ',&amp;:;_\-\.]*"/>
            <xsd:minLength value="1"/>
            <xsd:maxLength value="10"/>
        </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
</xsd:schema>

Ojalá sea esto y te funcione!

1voto

Leonardo-Tadei Puntos227320

Hola Carlos,

y no es posible poner el patrón encerrado como dato para que no falle el parser? Algo así como:

<xs:pattern value=<![CDATA["[A-Z0-9 ÑÇ´ÁÉÍÓÚ',&:;_\-\.]*"]]>/>

o

<xs:pattern value="<![CDATA[[A-Z0-9 ÑÇ´ÁÉÍÓÚ',&:;_\-\.]*]]>"/>

Tiene que haber alguna forma de pasar caracteres que no correspondan al schema sin romper el XML ...

Contanos si funciona para ver si seguimos buscando otras.

Saludos cordiales!

0voto

carlossevi comentado

Esta opción ya la probé pero me da error porque el atributo 'value' no puede contener el caracter '<'.
Interpreto que CDATA está pensado para ser colocado en el lugar del valor del elemento y no del atributo.

Ejemplo:

OK: <elemento atributo="valor"><![CDATA[contenido especial: \n áéíóúñ&]]></elemento>
KO: <elemento atributo="<![CDATA[contenido especial: \n áéíóúñ&]]>">valor</elemento>

Por cierto, para las pruebas estoy utilizando esta aplicación online:
http://www.freeformatter.com/xml-validator-xsd.html

También me falla con el plugin de XML Tools del Notepad++ pero este da menos información sobre los errores y sólo dice que el XSD no se puede interpretar.

0voto

Leonardo-Tadei comentado

Hola Carlos,

según estoy leyendo, se supone que si definís el XSD con por ejemplo el juego de caracteres UTF-8, y luego los caracteres especiales del pattern corresponden con la definición, debería tomarte bien los acentos y la eñe.

Bastaría con empezar así:

<?xml version="1.0“ encoding='UTF-8' ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...

Para probar esto desde la web que mencionás, tendrías que preparar los archivos e indicarle el URL para la validación. A todo esto, no está demás abrir con el navegador el XSD y en las propiedades verificar que haya llegado como UTF-8: hay servidores que sobreescriben el juego de caracteres con su propio default, y todo se rompe.

Contanos como te fue!

PD: encontré este PDF muy claro sobre varias cuestiones de XSD: http://interoperabilidadyarchivos.files.wordpress.com/2013/05/sintaxis-de-los-xml-schemas.pdf

0voto

carlossevi comentado

Hola leonardo, muchas gracias por tu ayuda. He probado a poner esa cabecera que ya la tenía incluida en los XML pero no en los XSD y ha subirlo a un servidor para poder validar vía URL pero me sigue fallando.

El mensaje que me da es:

The Entity ":" Was Referenced, But Not Declared.

Parece ser que el punto y coma no lo acepta. En cualquier caso, aunque no hay demasiada información sobre cómo encapsular las expresiones regulares en los patrones, es muy bueno el enlace que me has dejado.

0voto

Leonardo-Tadei comentado

Hola Carlos,

es un avance! Probá escapar el : en la expresión regular con \:
En un archivo XSD el : tiene sentido semántico y puede ser que a esto se deba el error.

0voto

carlossevi comentado

Sigue fallando. La versión online del comprobador da un error raro porque interpreta un cambio de element donde no debería:

The Entity Name Must Immediately Follow The '&' In The Entity Reference.

Sin embargo he descubierto que es más sencillo hacer este debug con el navegador ya que mi problema en este momento no es de validación de XML con su correspondiente Schema sino de que el Schema que estoy haciendo no es semánticamente correcto (tiene caracteres extraños). Abriéndolo con Firefox me da el mensaje siguiente:

Error de lectura XML: mal formado
Número de línea 13, columna 39:
<xs:pattern value="[A-Z0-9 ÑÇ´ÁÉÍÓÚ',&\:;_\-\.]*"/>
--------------------------------------^

Interpreto que no me deja utilizar la barra invertida =(

0voto

Leonardo-Tadei comentado

Carlos!

malditos caracteres raros para los sajones... parece que el error lo da el &. Este schema me está validando en el navegador (FF29):

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:element name="Libro">
         <xsd:complexType>
            <xsd:sequence>
                 <xsd:element name="Título" type="xsd:string"/>
                 <xsd:element name="Autores" type="xsd:string" maxOccurs="10"/>
                 <xsd:element name="Editorial" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="precio" type="xsd:double"/>
        </xsd:complexType>
   </xsd:element>
    <xsd:element name="nombre">
    <xsd:simpleType>
        <xsd:restriction base="xs:string">
            <xsd:pattern value="[A-Z0-9 ÑÇ´ÁÉÍÓÚ',&amp;:;_\-\.]*"/>
            <xsd:minLength value="1"/>
            <xsd:maxLength value="10"/>
        </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
</xsd:schema>

Ojalá sea esto y te funcione!

0voto

carlossevi comentado

¡Perfecto! ¡Muchas gracias! Selecciono la respuesta con todos sus comentarios aunque lo que me gustaría es que estuviera tu comentario como respuesta para que quede claro cuál es la solución.

0voto

Leonardo-Tadei comentado

Hola Carlos,

creé una nueva respuesta solo con la solución... a mi me gusta más tener el hilo completo, porque el desarrollo y los intentos también enriquecen, pero como los dos sabemos que mucha gente solo lee las primeras líneas de los textos, es posible que pocos lleguen a la solución final.

Cambiá vos ahora la respuesta seleccionada y nos queda lo mejor de ambos mundos.

Saludos cordiales!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta