Herramienta de validación de esquema XML (XSD)? [cerrado]

266

En la oficina, actualmente estamos escribiendo una aplicación que generará archivos XML contra un esquema que se nos proporcionó. Tenemos el esquema en un archivo .XSD.

¿Hay herramientas o bibliotecas que podamos usar para pruebas automatizadas para verificar que el XML generado coincida con el esquema?

Preferiríamos herramientas gratuitas que sean apropiadas para uso comercial, aunque no incluiremos el verificador de esquema, por lo que solo debe ser utilizado por los desarrolladores durante el desarrollo.

Nuestro lenguaje de desarrollo es C ++ si eso hace alguna diferencia, aunque no creo que deba hacerlo, ya que podríamos generar el archivo xml y luego hacer la validación llamando a un programa separado en la prueba.

Jason Dagit
fuente
132
Me encanta cuántas de estas preguntas "no constructivas" son los principales resultados de búsqueda de Google de las cosas que busco y las respuestas son útiles
Matt freake
1
Entiendo de dónde viene con lo no constructivo. Honestamente, aunque esta es una gran pregunta y el debate / argumentos a veces terminan derivando en excelentes respuestas
Matt
22
este es el caso exacto donde los administradores están siendo contraproducentes
anon58192932
Quizás valga la pena analizar una pregunta similar en el contexto de la herramienta de construcción Maven .
Alberto
Pruebe codverter.com/src/xmltoxsd
jonathana

Respuestas:

239

Después de investigar un poco, creo que la mejor respuesta es Xerces , ya que implementa todo XSD, es multiplataforma y se usa ampliamente. He creado un pequeño proyecto Java en github para validar desde la línea de comandos usando el analizador JRE predeterminado, que normalmente es Xerces. Esto se puede usar en Windows / Mac / Linux.

También hay una versión C ++ de Xerces disponible si prefiere usarla. La utilidad StdInParse se puede usar para llamarla desde la línea de comandos. Además, un comentarista a continuación apunta a esta utilidad de envoltura más completa .

También puede usar xmllint, que es parte de libxml . Es posible que ya lo tenga instalado. Ejemplo de uso:

xmllint --noout --schema XSD_FILE XML_FILE

Un problema es que libxml no implementa todas las especificaciones, por lo que puede tener problemas :(

Alternativamente, si está en Windows, puede usar msxml , pero necesitará algún tipo de contenedor para llamarlo, como la GUI que se describe en este artículo de DDJ . Sin embargo, parece que la mayoría de las personas en Windows usan un Editor XML, como Notepad ++ (como se describe en la respuesta de Nate ) o XML Notepad 2007 como lo sugiere SteveC (también hay varios editores comerciales que no mencionaré aquí).

Finalmente, encontrará que diferentes programas, desafortunadamente, darán resultados diferentes. Esto se debe en gran medida a la complejidad de la especificación XSD. Es posible que desee probar su esquema con varias herramientas.

ACTUALIZACIÓN : me he expandido sobre esto en una publicación de blog .

Adrian Mouat
fuente
1
Encontré lo siguiente útil: jmvanel.free.fr/xsd/README.html
Matthew Hegarty
Un ejemplo de uso de StdinParse (en linux) migth puede ser útil: StdInParse -n -s -f -v = always <XML_FILE. XML_FILE debe incluir la ubicación del esquema. Para mí da resultados más completos que xmllint.
helcim
3
¿Hay alguna manera de pedirle a un programa que use xsi: schemaLocation en lugar de alimentar todos los XSD manualmente?
Gabor Garami
@GaborGarami No por el momento, pero es una solicitud de función: github.com/amouat/xsd-validator/issues/5
Adrian Mouat
1
xmllintdesafortunadamente, no es compatible con expresiones regulares XML, por lo que algunas expresiones regulares válidas de XML no pasarán por él
Sergey Bushmanov
112

Hay un complemento para Notepad ++ llamado XML Tools que ofrece verificación y validación de XML contra un XSD.

Puedes ver cómo usarlo aquí .

Nate
fuente
55
-1, este complemento es
difícil de
2
Probé con npp 5.8.6, XMLTools 2.3.1 unicode beta2 r805, funciona bien.
Palani
55
Gran complemento Consulte Notepad ++ XmlTools Not Installation para obtener ayuda con la instalación.
ladenedge
16
Y con la versión 5.8.7, el Administrador de complementos de Notepad ++ ("Complementos / Administrador de complementos") hace que el proceso de instalación sea automático.
Aprovisionado
1
@FranzEbner Tuve este mismo problema. Si el XMLpropio hace referencia a un XSDarchivo, por ejemplo xsi:noNamespaceSchemaLocation="file.xsd", XML Tools intentará usarlo en lugar de darle un diálogo "establecido".
theblang
22

xmlstarlet es una herramienta de línea de comandos que hará esto y más:

$ xmlstarlet val --help
Kit de herramientas XMLStarlet: Validar documento (s) XML
Uso: xmlstarlet val <opciones> [<xml-file-or-uri> ...]
donde <opciones>
  -w o --well-formado - valida solo la buena formabilidad (predeterminado)
  -d o --dtd <dtd-file> - validar contra DTD
  -s o --xsd <xsd-file> - validar contra el esquema XSD
  -E o --embed - validar usando DTD incrustado
  -r o --relaxng <rng-file> - valida contra el esquema Relax-NG
  -e or --err: imprime mensajes de error detallados en stderr
  -b o --list-bad: enumera solo los archivos que no se validan
  -g o --list-good: enumera solo los archivos que validan
  -q o --quiet - no enumera archivos (solo devuelve el código de resultado)

NOTA: Los esquemas XML aún no son totalmente compatibles debido a que está incompleto
      soporte en libxml2 (ver http://xmlsoft.org)

XMLStarlet es un juego de herramientas de línea de comandos para consultar / editar / verificar / transformar
Documentos XML (para obtener más información, consulte http://xmlstar.sourceforge.net/)

El uso en su caso estaría en la línea de:

xmlstarlet val --xsd your_schema.xsd your_file.xml
Charles Duffy
fuente
3
¿Sabe cuán grave es la advertencia sobre no admitir completamente los esquemas xml?
Jason Dagit
2
A juzgar por otras respuestas, xmlstarlet es un poco débil en su implementación xsd.
Jason Dagit
3
Dado que xmlstarlet solo usa libxml2 debajo del capó, probablemente sea más fácil usar xmllint que se incluye con libxml2 y se explica en la respuesta aceptada.
Adrian Mouat
@JasonDagit, ... es exactamente tan débil como xmllint es: usan la misma implementación de biblioteca.
Charles Duffy
El modelo de contenido no es determinista. :-(
Greg
16

Para Windows existe el Bloc de notas XML gratuito 2007 . Puede seleccionar XSD para validar contra

ACTUALIZACIÓN: mejor aún, use Notepad ++ con el complemento XML Tools

SteveC
fuente
3

Yo uso Xerces:

http://xerces.apache.org/xerces-c/

Juan
fuente
1
¿Tienen una línea de comando que se puede usar desde una consola para verificar la validación de un archivo XSLT contra el XSD de XSLT 2.0?
Alexis Wilke
Sí, puede instalar una herramienta CLI con sudo apt install libxerces-c-samplesy luego verificar el documento con StdInParse -v=always -n -s < document.xml.
jgrocha
2

Solo estoy aprendiendo Schema. Estoy usando RELAX NG y estoy usando xmllint para validar. Me estoy frustrando por los errores que salen de xmlllint. Desearía que fueran un poco más informativos.

Si hay un atributo incorrecto en el XML, entonces xmllint le indica el nombre del atributo no admitido. Pero si le falta un atributo en el XML, recibirá un mensaje que dice que el elemento no se puede validar.

Estoy trabajando en un XML muy complicado con reglas muy complicadas, y soy nuevo en esto, por lo que rastrear qué atributo falta me lleva mucho tiempo.

Actualización: acabo de encontrar una herramienta de Java que me gusta mucho. Se puede ejecutar desde la línea de comandos como xmllint y es compatible con RELAX NG: https://msv.dev.java.net/

Pengo
fuente
2

Un editor XML para una validación XML rápida y fácil está disponible en http://www.xml-buddy.com

Solo necesita ejecutar el instalador y luego puede validar sus archivos XML con una aplicación de escritorio fácil de usar o la línea de comandos. Además también obtienes soporte para Schematron y RelaxNG. La validación por lotes también es compatible ...

Actualización 13/01/2012: la herramienta de línea de comandos es de uso gratuito y utiliza Xerces como analizador XML.

Clemens
fuente
1

Una gran herramienta visual para validar y generar XSD a partir de XML es IntelliJ IDEA, intuitiva y simple.

Jacktrade
fuente
1

Puede conectar su esquema XML a Intellisense de Microsoft Visual Studio. Esta opción le brinda validación en tiempo real Y autocompletar, lo cual es simplemente increíble.

Tengo este escenario exacto ejecutándose en mi copia gratuita de Microsoft Visual C ++ 2010 Express.

AaronDanielson
fuente
0

Tiendo a usar xsd de Microsoft para ayudar a generar el xsd desde un archivo .NET. También analizo secciones del xml usando xmlstarlet. La herramienta gratuita final que podría serle útil es altovaxml, que está disponible en esta URL: http://www.altova.com/download_components.html .

Esto me permite escanear todos los archivos xml seleccionando qué xsd usar al analizar el xml.

# Function:
#    verifyschemas - Will validate all xml files in a configuration directory against the schemas in the passed in directory
# Parameters:
#    The directory where the schema *.xsd files are located.  Must be using dos pathing like: VerifySchemas "c:\\XMLSchemas\\"
# Requirements:
#    Must be in the directory where the configuration files are located
#
verifyschemas()
{
    for FILENAME in $(find . -name '*.xml' -print0 | xargs -0)
    do
        local SchemaFile=$1$(getconfignamefromxml $FILENAME).xsd
        altovaxml /validate $FILENAME /schema $SchemaFile > ~/temp.txt 2> /dev/null
        if [ $? -ne 0 ]; then
            printf "Failed to verify: "
            cat ~/temp.txt | tail -1 | tr -d '\r'
            printf "    - $FILENAME with $SchemaFile\n"
        fi
    done
}

Para generar el xml, uso: xsd DOTNET.dll / type: CFGCLASS & rename schema0.xsd CFGCLASS.xsd

Para obtener el nombre xsd, uso: xmlstarlet sel -t -m / XXX / * -v local-name () $ 1 | sed 's / $ //'

Esto me permite recoger el XSD correcto usando una etiqueta de elemento dentro del archivo xml.

El resultado neto es que puedo llamar a una función bash para escanear todos los archivos XML y verificarlos. Incluso si están en múltiples subdirectorios.

Andrew Stern
fuente