2011-08-25 7 views
58

En un documento de esquema xml, si tengo tanto el targetNamespace como el xmlns sin un prefijo.targetNamespace y xmlns sin prefijo, ¿cuál es la diferencia?

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.com/" xmlns="http://example.com/"> 

¿Cuál es la diferencia exacta entre ellos? Mi comprensión es que si tienes un xmlns sin un prefijo, todos los elementos sin prefijo obtienen ese espacio de nombres y ... de manera confusa lo mismo ocurre con targetNamespace.

+0

podría carecer de un cierto conocimiento sobre este tema, pero no podía ser la respuesta: xmlns es el espacio de nombres predeterminado para ESTE documento (el documento de esquema), mientras que targetNamespace es el espacio de nombre que valida este documento de esquema? Y de esta manera, ¿xmlns y targetNamespace son dos cosas diferentes? – Vering

+0

@Vering mis resultados de la prueba coinciden con su primera oración sí, el targetNamespace definitivamente se refiere al documento que el esquema valida. La presencia de targetNamespace parece necesitar también la presencia de 'xmlns' o 'xmlns: xxx'. De hecho, puede combinar muchos 'xmlns: xxx', 'xmlns: yyy' y 'xmlns' juntos y todavía se valida. – ifelsemonkey

Respuesta

67

targetNamespace es un "artefacto" de esquema XML; su propósito: indicar qué espacio de nombres XML particular describe el archivo de esquema.

xmlns - como el Esquema XML es un documento XML, entonces es posible definir un espacio de nombres XML predeterminado para el archivo XML (esto es lo que hace el atributo xmlns); las implicaciones son múltiples: autoría y composición. Por ejemplo, uno no tiene que usar un prefijo para los elementos definidos en el esquema, que más tarde se hace referencia en otro lugar en el mismo archivo (por ejemplo, un simpleType global utilizado como tipo para un atributo o elemento).

Desde mi experiencia, muchos autores de esquemas XML consideran esto como una "mejor práctica" ... por lo que está en el camino correcto.

En términos de XSD, targetNamespace prescribe la parte de espacio de nombres de un nombre calificado de un componente de esquema, que incluye elementos, atributos, grupos y grupos de atributos, y tipos simples y complejos. Algunos de los nombres calificados definidos en un XSD (elementos y atributos) son utilizados "directamente" por un documento de instancia XML. Otros, como los tipos, se pueden referenciar a través del atributo xsi:type en documentos XML de instancia. El resto (grupos, grupos de atributos) están ahí para facilitar la composición del esquema (a través de referencias).

También soy de la opinión de que (en general) la gente viene a diseñar XSD desde dos ángulos:

  • para que coincida con un XML existente. En este caso, si su XML usa espacios de nombres, para cada uno de los espacios de nombres utilizados, terminará con un elemento de esquema XSD con un atributo targetNamespace coincidente.

  • modelado puro. A continuación, piensa en targetNamespace similar a un paquete UML, o esquema de base de datos, o un paquete Java, o un espacio de nombres .NET, y todo lo que significa en este caso. Fundamentalmente es un mecanismo para evitar el nombramiento de colisiones; Sin embargo, es también un mecanismo para dividir los modelos en áreas sujetas, etc.

13

xmlns

El atributo xmlns establece el espacio nombre predeterminado del elemento descrito. Por lo tanto, el espacio de nombre predeterminado se aplica a todos los elementos dentro del elemento descrito, que no declaran explícitamente otro espacio de nombre para ellos.

El espacio de nombre por defecto se establece en un valor estándar para archivos WSDL: http://www.w3.org/ns/wsdl

targetNamespace

Este atributo contiene el espacio de nombre de su servicio web. Puede elegir este espacio de nombre libremente, pero hay una convención que dice que el URI debe apuntar al WSDL del servicio.

xmlns: TNS

Este espacio de nombres se deben establecer en el mismo URI que el atributo targetNamespace. De esta forma, puede consultar el espacio de nombre de destino a través de este prefijo de espacio de nombre (tns).

Fuente: http://tutorials.jenkov.com/wsdl/description.html

14

Para aquellos que todavía están confundidos, tenga en cuenta estos tres XSDs. Todos ellos definen un tipo global y una definición de elemento global que lo hace referencia.

Primero, una xsd como la publicada arriba. Se utiliza el prefijo 'xsd' para el espacio de nombres de esquema, y ​​un espacio de nombres predeterminado para el targetNamespace:

<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/" 
    xmlns="http://example.com/"> 

    <xsd:element name="aGlobalElement" type="aGlobalType"/> 

    <xsd:simpleType name="aGlobalType"> 
    <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 

Ahora mismo xsd, pero la definición y el uso de un prefijo de espacio de nombres para el espacio de nombres:

<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/" 
    xmlns:tns="http://example.com/"> 

    <xsd:element name="aGlobalElement" type="tns:aGlobalType"/> 

    <xsd:simpleType name="aGlobalType"> 
    <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 
</xsd:schema> 

... y, por último, una versión que utiliza un espacio de nombres predeterminado en lugar de 'xsd' para el espacio de nombres del esquema XML:

<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://example.com/" 
    xmlns:tns="http://example.com/"> 

    <element name="aGlobalElement" type="tns:aGlobalType"/> 

    <simpleType name="aGlobalType"> 
    <restriction base="string"/> 
    </simpleType> 
</schema> 

la mayoría de los autores de esquema elegir la primera o la última, porque si el recurso predeterminado del espacio de nombres está disponible, entonces también podríamos usarlo para algo.

-1

Después de algunas pruebas exhaustivas usando xmllint Creo que encontré la explicación definitiva aquí. Considere el siguiente esquema:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema 
version="1.0" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://yyyzzz.com" 
xmlns:p="http://abced.com" 
xmlns:q="http://pqr.com" 
xmlns="http://yyyzzz.com"> 

<xsd:element name="recipe" type="recipeType" /> 

<xsd:complexType name="recipeType"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="desc" type="xsd:string" /> 
     <xsd:attribute name="archetype" type="xsd:string" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 
</xsd:schema> 

El esquema anterior valida el documento a continuación:

<?xml version="1.0"?> 

<recipe xmlns="http://yyyzzz.com"> 
    Deciphering the purpose of targetNamespace 
</recipe> 

La razón por la que funciona es porque xmlns = "http://yyyzzz.com" se une automáticamente a ¡el elemento está siendo definido por el esquema también! Eso significa que también se une al elemento recipeType.

Ahora, con el mismo documento XML pero con el esquema ligeramente modificada de la siguiente manera también valida y echar un vistazo de cerca a la diferencia:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema 
version="1.0" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://yyyzzz.com" 
xmlns="http://eigenfield.aparicio.com" 
xmlns:EGboy="http://yyyzzz.com"> 

<xsd:element name="recipe" type="EGboy:recipeType" /> 

<xsd:complexType name="recipeType"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="desc" type="xsd:string" /> 
     <xsd:attribute name="archetype" type="xsd:string" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

</xsd:schema> 

haga caso de los otros xmlns desaparecido, pero en lugar de mirar de cerca type = "EGboy: recipeType". Ya no podemos confiar en el xmlns porque tiene un valor diferente, por lo tanto, debemos poner el prefijo EGboy delante de recipeType.

el documento XML ni siquiera le importa de la EGboy prefijo de este prefijo es sólo para el esquema que se refiere a los propios xmlns en caso de que haya muchos.

2

targetNamespace es un atributo de schema elemento define el espacio de nombres, es decir, el paquete en el archivo XSD. Por convención usamos URI/URL, pero podríamos usar cualquier cadena.

xmlns es un atributo que se utiliza para referir elementos y tipos de datos que provienen del valor del atributo xmlns para el ámbito del elemento actual.

Por ejemplo:

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" es con el prefijo como xsd significa espacio de nombres debería tener el prefijo xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" sin prefijo es predeterminado
  • xmlns: p = "http: //www.example. com/Personas "está con el prefijo como p significa que el espacio de nombre debe tener el prefijo p:

Donde xmlns:xsd y xmlns:p son QNames y xmlns es el nombre local.

La siguiente imagen ayuda a entender XSD usando la analogía de Java según mi leal saber:

enter image description here

Cuestiones relacionadas