targetNamespace y xmlns sin prefijo, ¿cuál es la diferencia?


En un documento de esquema xml, si tengo el targetNamespace y el xmlns sin prefijo.

<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 tiene un xmlns sin prefijo, todos los elementos sin prefijo obtienen ese espacio de nombres y...confusamente lo mismo ocurre con targetNamespace.

Author: M. A. Kishawy, 2011-08-25

5 answers

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

Xmlns - debido a que el esquema XML es un documento XML, es posible definir un espacio de nombres XML predeterminado para el propio archivo XML (esto es lo que hace el atributo xmlns); las implicaciones son múltiples: creación y composición. Por ejemplo, no es necesario utilizar un prefijo para los elementos definidos en el esquema, que se encuentran más adelante se hace referencia a 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"... así que estás en el camino correcto.

En términos de XSD, el 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" directamente " utilizados por un documento de instancia XML. Otros, como for types, pueden ser referenciados 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 hacer coincidir un XML existente. En este caso, si su XML utiliza espacios de nombres, para cada uno de los espacios de nombres usados, terminarás con un elemento de esquema XSD con un atributo targetNamespace coincidente.

  • Puro modelaje. Entonces 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 colisiones de nombres; sin embargo, también es un mecanismo para particionar modelos en áreas temáticas, etc.

 71
Author: Petru Gardea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 12:56:52

Para aquellos que todavía están confundidos, consideren estas tres xsd. Todos ellos definen un tipo global y una definición de elemento global que hace referencia a él.

Primero, un xsd como el publicado arriba. Se utiliza el prefijo 'xsd" para el espacio de nombres del 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 el mismo xsd, pero definiendo y usando un prefijo de espacio de nombres para el espacio de nombres de destino:

<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 finalmente, una versión que usa 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 del esquema eligen el primero o el último, porque si la instalación de espacio de nombres predeterminada está disponible, entonces también podríamos usarla para algo.

 15
Author: kimbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-08 14:35:24

Xmlns

El atributo xmlns establece el espacio de 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 por sí mismos.

El espacio de nombres predeterminado se establece en un valor estándar para los archivos WSDL: http://www.w3.org/ns/wsdl

TargetNameSpace

Este atributo contiene el espacio de nombres de su servicio web. Puedes elija 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 debe establecerse en el mismo URI que el atributo targetNamespace. De esta manera, puede hacer referencia al espacio de nombre de destino a través de este prefijo de espacio de nombre (tns).

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

 13
Author: HakunaMatata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-15 19:39:13

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

xmlns is an attribute se usa 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 prefijo como xsd significa que el espacio de nombres debe tener el prefijo xsd:
  • xmlns="http://www.w3.org/2001/XMLSchema" sin prefijo es predeterminado
  • xmlns: p="http://www.example.com/People" es con prefijo como p significa que el espacio de nombres 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 analogía Java según mi conocimiento:

introduzca la descripción de la imagen aquí

 3
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-11 12:29:55

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 siguiente documento:

<?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 al elemento que está siendo definido por el esquema también! Esto significa que también se une al elemento recipeType.

Ahora, con el mismo documento xml pero con un esquema ligeramente modificado como a continuación también valida y echa 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> 

Ignore si el otro xmlnsha desaparecido, pero en su lugar mire 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.

Al documento xml ni siquiera le importa el prefijo EGboy este prefijo es solo para que el esquema se refiera al prefijo xmlns en caso de que haya muchos.

 -1
Author: ifelsemonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-16 06:14:46