Buscar..


Observaciones

Los nombres de elementos y atributos en XML se denominan QNames (nombres calificados).

Un QName está hecho de:

  • un espacio de nombres (un URI)
  • un prefijo (un NCName, NC porque no contiene dos puntos)
  • un nombre local (un NCName)

Solo el espacio de nombres y el nombre local son relevantes para comparar dos QNames. El prefijo es solo un proxy para el espacio de nombres.

El espacio de nombres y el prefijo son opcionales, pero el espacio de nombres siempre está presente si el prefijo está presente (esto se garantiza en el nivel sintáctico, por lo que no se puede hacer mal).

La representación léxica de un QName es prefix:local-name . El espacio de nombres se enlaza por separado utilizando los atributos xmlns:... especiales (recordatorio: los atributos que comienzan con xml están reservados en XML).

Si el prefijo está vacío, no se utilizan dos puntos en la representación léxica del QName, que solo contiene el local-name . Los QNames con un prefijo vacío no tienen espacio de nombres (si no hay un espacio de nombres predeterminado dentro del alcance) o están en el espacio de nombres predeterminado.

Unir un prefijo a un espacio de nombres

Un espacio de nombres es un URI, pero para evitar la verbosidad, los prefijos se utilizan como un proxy.

En el siguiente ejemplo, el prefijo my-prefix está vinculado al espacio de nombres http://www.example.com/my-namespace utilizando el atributo especial xmlns:my-prefix ( my-prefix puede reemplazarse con cualquier otro prefijo) :

<?xml version="1.0"?>
<my-prefix:foo xmlns:my-prefix="http://www.example.com/my-namespace">
  <!-- the element my-prefix:foo
       lives in the namespace http://www.example.com/my-namespace -->
</my-prefix:foo>

Ausencia de espacio de nombres

En XML, los nombres de elementos y atributos viven en espacios de nombres.

Por defecto, no están en ningún espacio de nombres:

<?xml version="1.0"?>
<foo attr="value">
  <!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>

Irrelevancia de los prefijos

Estos dos documentos son equivalentes semánticamente, ya que los espacios de nombres son importantes, no los prefijos.

<?xml version="1.0"?>
<myns:foo xmlns:myns="http://www.example.com/my-namespace">
</myns:foo>

<?xml version="1.0"?>
<ns:foo xmlns:ns="http://www.example.com/my-namespace">
</ns:foo>

Espacio de nombres predeterminado

El espacio de nombres predeterminado es el espacio de nombres correspondiente a la ausencia de cualquier prefijo. Se puede declarar con el atributo xmlns especial.

<?xml version="1.0"?>
<foo xmlns="http://www.example.com/my-namespace">
  <!-- the element foo is in the namespace
       http://www.example.com/my-namespace -->
</foo>

Si no se declara ningún espacio de nombres predeterminado, los nombres sin prefijo no están en ningún espacio de nombres.

Atributos de nombres sin prefijo

Los elementos y atributos se comportan de manera diferente con respecto a los espacios de nombres predeterminados. Esto es a menudo la fuente de confusión.

Un atributo cuyo nombre no tiene prefijo vive en ningún espacio de nombres, también cuando un espacio de nombres predeterminado está dentro del alcance .

<?xml version="1.0"?>
<foo attr="value" xmlns="http://www.example.com/my-namespace">
  <!-- The attribute attr is in no namespace, even though
       a default namespace is in scope. The element foo,
       however, is in the default namespace. -->
</foo>

Alcance de los enlaces de espacio de nombres

Un enlace de espacio de nombres ( xmlns especiales o xmlns:... atributo) está en el alcance de todos los descendientes del elemento que lo incluye, incluido este elemento.

<?xml version="1.0"?>
<root>
  <my:element xmlns:my="http://www.example.com/ns1">
    <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  </my:element>
  <my:element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2 -->
  </my:element>
</root>

El enlace se puede anular en un elemento anidado (aunque esto afecta la legibilidad):

<?xml version="1.0"?>
<my:element xmlns:my="http://www.example.com/ns1">
  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:first-child-element/>

  <my:child-element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2,
         including for the element my:child-element -->
  </my:child-element>

  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:last-child-element/>

</my:element>

Es muy común declarar todos los enlaces de espacio de nombres en el elemento raíz, lo que mejora la legibilidad.

<?xml version="1.0"?>
<root
  xmlns="http://www.example.com/default-namespace"
  xmlns:ns1="http://www.example.com/ns1"
  xmlns:ns2="http://www.example.com/ns2">
  
  <ns1:element>
    <ns2:other-element/>
  </ns1:element>

</root>


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow