xml
Espacios de nombres
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>