Validación XML con XSD en Visual Studio IDE

96

Sé que he hecho esto antes, pero hoy no funciona, ni puedo encontrar ningún lugar que explique cómo hacerlo. Podría ser mi falta de sueño, pero sospecho que son gremlins.

Tengo un documento XML y un directorio lleno de XSD que lo definen. ¿Cómo configuro el IDE visual para que me notifique de fallas de validación y luego proporcione una lista inteligente de etiquetas y atributos válidos en un contexto dado?

Lo que he probado:

  • Agregué los XSD al proyecto con el documento XML.
  • Agregué los XSD a la lista de esquemas XML (en XML / Schemas ... elemento de menú).
  • Incluso he incluido los atributos schemaLocation y noNamespaceSchemaLocation en el documento XML.

Visual Studio todavía no está renunciando a ninguna información útil de depuración o edición. Probé tanto en 2010 como en 2008 (lo había hecho antes en 2008, pensé)

Actualización: hice que otro desarrollador probara esto y también le falló. Sabe que lo ha hecho con otros documentos XML y ha funcionado. Luego descargué el editor XML de Oxygen y funcionó bien en los mismos archivos XML y XSD, por lo que los archivos parecen estar bien (o Oxygen es más tolerante / flexible...)

Jim McKeeth
fuente

Respuestas:

138

Deberá asociar el documento XML en Visual Studio con el archivo XSD que tiene.

  1. Debería ver algo como esto en la ventana Propiedades del documento XML:

    Propiedades XML> Esquema

  2. En el editor de conjuntos de esquemas XML (se abre al hacer clic en los puntos suspensivos (...) en el cuadro de texto "Esquemas" en la ventana Propiedades), debe asegurarse de tener su esquema presente. Además, asegúrese de que la Usecolumna para ese esquema esté habilitada; de lo contrario, haga clic en ella; obtendrá una lista desplegable de opciones, elija la Useque tiene la marca de verificación verde:

    Selector de esquema XML

  3. Asegúrese de que la ventana Lista de errores de Visual Studio esté visible (menú Ver> Lista de errores). Esto mostrará todas las inconsistencias entre las definiciones de esquema XML y XSD.

  4. Una vez que todo eso esté en su lugar, el editor XML de Visual Studio debería resaltar los problemas con su XML en el editor usando garabatos azules:

    Ejemplo de error

marc_s
fuente
Gracias, esa es una gran explicación detallada, pero la mía todavía no funciona. No sabía que se podía acceder a la lista de esquemas desde propiedades como esa.
Jim McKeeth
@Jim McKeeth: ¿qué pasa si modificas tu XML y lo guardas de nuevo? A veces, la validación XML necesita un disparador para
activarse
Acepté tu respuesta aunque no funcionó para mí. Supongo que mi sistema se acaba de limpiar, pero me cambié a una computadora nueva y todo funciona bien ahora.
Jim McKeeth
38
@jim No estoy seguro de si tuviste el mismo problema, pero pasé una cantidad ridícula de tiempo antes de darme cuenta de que el archivo XML debe estar abierto en el editor y el foco debe estar en el editor cuando abres la ventana Propiedades. Solo entonces obtiene las propiedades del "Documento XML" donde puede asignar un esquema. Si el foco está en el Explorador de soluciones, la ventana Propiedades muestra solo las propiedades del archivo, es decir, no es posible asignar ningún esquema allí.
herzbube
2
Creo que deberías agregar los hallazgos de @herzbube en la propia respuesta.
ashish
35

No es necesario que asocie manualmente los archivos en Visual Studio; hará coincidir automáticamente un archivo XML con un archivo XSD si tiene ambos abiertos y tiene su espacio de nombres definido correctamente.

Para definir el espacio de nombres:

En el elemento raíz del archivo XML:

<Data xmlns='http://yourdomain.com/yourschema.xsd'>
    ...
</Data>

En el elemento de esquema del archivo XSD:

<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://yourdomain.com/yourschema.xsd"
    xmlns:this="http://yourdomain.com/yourschema.xsd"
    elementFormDefault="qualified">
    ...
</xs:schema>

Una nota sobre el uso de tipos en su esquema cuando tiene un targetNamespace

Debido a que está especificando un targetNamespaceen su esquema, cualquier referencia a los tipos definidos en el esquema deberá tener un prefijo con un espacio de nombres (por lo que agregamos el xmlns:thisatributo en el <xs:schema />elemento anterior ).

<!-- Define the type as normal -->
<xs:complexType name="Row">
    <xs:sequence>
        <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="Value" type="xs:float" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>
<!-- Use the type (note the "this:" prefix) -->
<xs:element name="Row" type="this:Row" minOccurs="0" maxOccurs="unbounded" />
Ross McNab
fuente
3

Otro punto de falla aquí son los archivos de esquema de "bloqueo" de Windows 7 ... haga clic derecho en el archivo xsd en el disco, Propiedades> General y si está bloqueado, tendrá un botón "Desbloquear". Esto estaba causando que mi validación XML fallara en VS2012.

EJA
fuente
1

¿Su xsd contiene un atributo "targetNamespace" /schema/@targetNamespacesimilar al espacio de nombres al que hace referencia en el xml?

Ejemplos:

XSD :

<xs:schema .... targetNamespace="Datafile.xsd" ... >

XML :

<data xmlns="Datafile.xsd" >...</data>

Ver también: XML / XSD intellisense no funciona en Visual Studio 2010

k3b
fuente
0

Tuve este mismo problema, pero VS ya estaba haciendo referencia a mi esquema correctamente. Resulta que el archivo que estaba tratando de validar no tenía una extensión de archivo 'xml'. Agregué .xml al final de mi nombre de archivo y la validación comenzó a funcionar.

John Livermore
fuente