2009-07-23 16 views
14

Siempre he encontrado que la validación frente a un esquema es una protección invaluable contra thinkos y me gustaría incorporar comprobaciones de validación como parte de un proyecto donde frecuentemente necesito escribir manualmente archivos XML. cien líneas de longitud. Mi editor de texto tiene una función de integración de CLI bastante buena, así que estoy buscando un validador de línea de comandos.Validador de línea de comandos XML para Windows

Cuando no he encontrado ninguna claros ganadores a través de Google, Asomé por aquí y halló una similar question, pero ninguno de los instrumentos sugeridos no encaja en mis necesidades:

  • libxml (a través de cygwin) - hace no informa los números de línea; No tengo ni idea donde mis errores son!
  • msxml - no se puede ejecutar desde la línea de comandos?
  • xerces-c - parece requerir una copia de Visual C?
  • xerces2-j - no se puede ejecutar desde la línea de comandos?
  • xmlstarlet - apoyo insuficiente XSD *

(* El esquema que estoy validando contra utiliza grupos de sustitución - inapropiadamente, pero es externo al proyecto, por lo que no se puede cambiar - lo que provoca xmlstarlet a ahogarse incluso en archivos válidos.)

Normalmente, este es el punto en la solución de un problema en el que me daría por vencido en buscar una solución existente y alcanzar el Python-hammer, pero el soporte XML de Python es notoriamente ... bueno ... en realidad, simplemente dejémoslo en "notorio".

Así que he vuelto a buscar una herramienta preexistente. Mis requisitos son bastante simples:

  • se ejecuta en Win32 (Windows XP SP3, específicamente)
  • de línea de comandos; mi editor puede trabajar con casi cualquier combinación de entrada estándar de entrada/salida/ERR, los argumentos, los archivos temporales, etc.
  • apoyo XSD razonablemente completo (en especial espacios de nombres y grupos de sustitución)
  • informa del número de línea donde se produjo el error !

¿Existe una herramienta de este tipo? Preferiría no tener que instalar Visual Studio y mis amigos (demasiado hinchado, IMO), pero ya tengo instalados Cygwin y Python.

Respuesta

13

Su primera opción, xmllint (libxml2), da los números de línea para los errores en el xml (y también en el xsd). Probablemente solo necesites una versión posterior. Me acaba de confirmar tanto el uso de mi copia, que es: la producción

> xmllint --version 
xmllint: using libxml version 20627 

Ejemplo:

invalidXml.xml:4: element c: Schemas validity error : Element 'c': This element is not expected. Expected is (b). 
invalidXml.xml fails to validate 
<?xml version="1.0"?> 
<invalidXmlEg> 
    <a/> 
<!-- <b></b> --> 
    <c/> 
</invalidXmlEg> 

Cuando el xsd es:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="invalidXmlEg"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="a" type="xs:string" /> 
     <xs:element name="b" type="xs:string" /> 
     <xs:element name="c" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

NOTA: Me he dado cuenta de que xmllint aceptará elementos nombres que no debería (por ejemplo, "<invalidXml.xsd>"), pero esto no parece afectar su tarea.

EDITAR la adición de la "compilado con" parte de la versión:

compiled with: Threads Tree Output Push Reader 
Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy 
C14N Catalog XPath XPointer XInclude Iconv ISO8859X 
Unicode Regexps Automata Expr Schemas Schematron 
Modules Debug Zlib 
+0

¡Interesante! La versión que estoy usando es 20703, que produce "Elemento 'c': este elemento no se espera. Se espera (b) .'" (casi idéntico, pero carece de número de línea). Tendré que ver si puedo desenterrar y una versión anterior. –

+0

Parece un paso atrás ... Me pregunto si agregaron una opción, si los números de línea están incluidos o no. Puede valer la pena consultar los documentos (tal vez --verbose). O ... ¿tal vez tiene que ver con lo que se ha compilado? No incluí eso, pero lo agregaré (también estoy ejecutando en Linux, lo que no debería hacer ninguna diferencia): está compilado con: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib – 13ren

+0

Parece que la versión de 'libxml' en Cygwin se compila con las mismas opciones, y no parece haber ninguna opción' --verbose'. Terminé agarrando los binarios de Win32 para 2.6.27 del sitio oficial y funciona muy bien. Un paso hacia atrás, de hecho. :-) –

1

Puede probar una de las ediciones Visual Studio 2008 Express. Ahora hay una mejor compatibilidad con XML, incluida la validación, por supuesto, pero también XML Intellisense, fragmentos XML y una vista de Esquema XML.

+0

Dudo que devenv pueda validar archivos XML en la línea de comandos. – Joey

+0

No sugerí que pudiera. Sugiero que la experiencia de interfaz de usuario puede ser lo suficientemente buena como para cambiar la forma en que trabaja con archivos XML. –

2

Sugeriría Windows Powershell con PowerShell Community eXtensions. PSCX tiene el cmdlet Test-xml que tiene la siguiente Get-Help descripción detallada:

Pruebas para así formedness y opcionalmente valida contra el esquema XML. No maneja especificar el espacio del targetName . Para ver los mensajes de error de validación, especifique el indicador -Verbose.

No sé si informa los errores con los números de ropa, pero 3 de cada 4 no está nada mal.

0

Xerces-J viene con una aplicación de ejemplo, jaxp.SourceValidator. Puede alimentarlo con su archivo XML y lo validará.

En cuanto a Xerces-C, no he utilizado yo mismo, pero sé que no requiere todo el Visual C++, todo lo que necesita es tiempo de ejecución archivos. Estos se pueden descargar por separado de Microsoft. Parece que hay una aplicación de muestra que hace lo que necesita - consulte StdInParse

3

Como se mencionó anteriormente en 13ren, xmllint de libxml informa los números de línea; tal vez tenga un problema de versión. Puede que le resulte útil obtener versiones nativas (no cygwin) de las herramientas libxml/libxslt desde http://www.zlatkovic.com/libxml.en.html

También le recomendamos echar un vistazo a msv desde Sun. No es una implementación completa de XSD, pero podría hacer el trabajo (lo uso para la validación de RelaxNG en general)

1

No se puede comentar, pero la última versión de xmllint (20708) El puerto de Windows de Igor Zlatkovic está dando números de línea como bien.

Cuestiones relacionadas