2009-04-11 61 views
19

Ha estado preguntándose, al igual que usamos la -declaración para vincular XML a una DTD, ¿cómo lo hacemos con XSD?¿Cómo se vincula XML a un XSD?

muestra de MSDN:

<?xml version="1.0"?> 
<Product ProductID="123" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="Product.xsd"> 
    <ProductName>Rugby jersey</ProductName> 
</Product> 

es que el xsi: noNamespaceSchemaLocation que hace el truco? ¿O es solo otro espacio de nombres?

[EDIT] Y es el ..line

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

sólo para darnos un espacio de nombres XML único, o también proporcionar información sobre el esquema donde se puede localizar?

Respuesta

17

Probar schemaLocation.

<?xml version="1.0"?> 

<note 
xmlns="http://www.w3schools.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.w3schools.com note.xsd"> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note> 

noNamespaceSchemaLocation es diferente. Tenga en cuenta que ambos son, de hecho, solo "sugerencias" en teoría, para un consumidor de un documento XML. Nunca me he encontrado con un procesador xml que no los haya seguido; después de todo, es una recomendación del W3C. ver http://www.w3.org/TR/xmlschema-1/

Pero de hecho, podría ir mal, como here, pero por otra parte, se considera un error por una razón.

ir corto: acabo de confiar en él, sin ningún daño hasta el momento :-)

No creo que cualquier procesador de medio decente XML puede ignorar este 'toque' en estos días.

Las direcciones URL son siempre únicas, pero en algunos casos se proporcionará cierta información en la URL.

+0

Si se está ejecutando en un entorno en el que se bloquea el acceso a Internet, los esquemas no se cargarán. Además, tu sintaxis es incorrecta. Es el espacio de nombres ubicación espacio de nombres ubicación ... –

+2

@Peter Ciertamente no es del W3C. w3schools.com no tiene nada que ver con el W3C. –

+0

@John es solo una copia de W3Schools – Peter

4

xsi: noNamespaceSchemaLocation y xsi: schemaLocation proporcionan pistas a los procesadores XML que decidan obedecer esas sugerencias. Pero son solo pistas. No necesariamente hacen que su documento valide contra el esquema.

3

Por lo general, solo incluyo el espacio de nombres y espero que si quien está procesando se preocupe de validarlo, obtendrán el esquema y configurarán su entorno de procesamiento para que pueda encontrar el XSD. Tuve un éxito limitado con xsi:schemaLocation y tales atributos. La mayoría de los problemas generalmente se centran en encontrar el archivo XSD. Algunos procesadores quieren que se incluya la ruta, lo que es muy divertido si el XSD está en un sistema de archivos en lugar de un servidor web.

Cada procesador parece implementar la búsqueda de una manera un poco diferente. Algunos usan objetos de catálogo de esquema separados, otros requieren que cargue y adjunte esquemas por separado. A menos que proporcione el código para procesar documentos, es mejor que no incluya xsi:schemaLocation o xsi:noNamespaceSchemaLocation en mi humilde opinión. Lo único que puede hacer su inclusión es que los isquiotibiales que están procesando su documento coloquen el esquema en la misma ubicación o encuentren la manera de hacer que el procesador elegido ignore o resuelva la especificación de ubicación.

Como nota al margen, el mayor problema con el que me he encontrado fue en realidad con las DTD que se especificaron mediante una declaración SYSTEM que se refería a "c:\somepath\doc.dtd". El problema era que estaba procesando los documentos en una caja de FreeBSD. Terminé escribiendo mi propio resolvedor para mapear las rutas al estilo de Windows a un sistema de archivos local, ya que no podía modificar los documentos por sí mismo y era necesario validarlos.

3

No es una pregunta estúpida, pero John Saunders has it right.

del mismo modo que usamos la -decleración para vincular XML a una DTD, ¿cómo lo hacemos con XSD?

Aquí está la esencia del problema: no se puede. Uno de los problemas con el enfoque DTD fue que el documento especificaba el mecanismo de validación y no el documento consumidor. Post-DTD, puede tomar un documento XML y validarlo con XSD o RELAX NG o algún otro mecanismo: están desacoplados (al menos en teoría). Cualquier enlace XSD es solo una pista y es opcional. It is not possible to validate an arbitrary document.

+0

@McDowell: Muchas gracias. –