¿Qué significa "xmlns" en XML?

415

Vi la siguiente línea en un archivo XML:

xmlns:android="http://schemas.android.com/apk/res/android"

También he visto xmlnsen muchos otros archivos XML que he encontrado.

¿Qué es?

usuario88637
fuente
Consulte también ¿Dónde se define el atributo xmlns?
kjhughes
Ahora también debería saber por qué tenemos errores en el xml cuando usamos las etiquetas incorrectamente o en el lugar equivocado. :)
Vaibs

Respuestas:

299

Define un espacio de nombres XML .

En su ejemplo, el prefijo del espacio de nombres es " android " y el URI del espacio de nombres es " http://schemas.android.com/apk/res/android "

En el documento, ve elementos como: <android:foo />

Piense en el prefijo del espacio de nombres como una variable con un alias de nombre corto para el URI del espacio de nombres completo. Es el equivalente de escribir <http://schemas.android.com/apk/res/android:foo />con respecto a lo que "significa" cuando un analizador XML lee el documento.

NOTA: en realidad no puede utilizar el URI de espacio de nombres completo en lugar del prefijo de espacio de nombres en un documento de instancia XML.

Consulte este tutorial sobre espacios de nombres: http://www.sitepoint.com/xml-namespaces-explained/

Mads Hansen
fuente
6262
Siempre pego esos URI en un navegador web solo para ver qué está mirando el analizador, pero siempre devuelve 404. ¿Se supone que es un URI real que necesita un nombre de archivo estándar pegado al final, o es solo una técnica por hacer una identificación única?
Patrick
36
@Patrick sí, es solo un URI que debe ser único para indicar que es un espacio de nombres separado de los demás y, por lo tanto, cualquier etiqueta duplicada potencial se interpretará correctamente. Por lo tanto, el URI a menudo no señalará nada.
foochow
3
Hmm ... es bueno saber que es un espacio de nombres. Me preguntaba si al especificar un URI la página html realmente tenía acceso a ese sitio web para determinar un esquema.
Nav
17
@Patrick, URI no es lo mismo que URL. Una URL es un localizador y un URI es solo un identificador. Muy bien podría elegir un GUID como URI. De hecho, el ISBN que tenemos para los libros es una forma de URI.
Jaywalker
entonces, ¿cómo funcionan las etiquetas? Me refiero a <LinearLayouttrabajos sin prefijo?
Asif Mushtaq
676

Significa espacio de nombres XML .

Básicamente, cada elemento (o atributo) en XML pertenece a un espacio de nombres, una forma de "calificar" el nombre del elemento.

Imagina que tú y yo inventamos nuestro propio XML. Inventa XML para describir personas, yo invento el mío para describir ciudades. Ambos incluimos un elemento llamado name. El tuyo se refiere al nombre de la persona, y el mío al nombre de la ciudad. De acuerdo, es un poco artificial.

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

Si nuestros dos XML se combinaran en un solo documento, ¿cómo distinguiríamos los dos nombres? Como puede ver arriba, hay dos nameelementos, pero ambos tienen significados diferentes.

La respuesta es que usted y yo asignaríamos un espacio de nombres a nuestro XML, que haríamos único:

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

Ahora que hemos calificado completamente nuestro XML, no hay ambigüedad en cuanto a lo nameque significa cada elemento. Todas las etiquetas que comienzan personxml:son etiquetas que pertenecen a su XML, todas las que comienzan cityxml:son mías.

Hay algunos puntos a tener en cuenta:

  • Si excluye cualquier declaración de espacio de nombres, se considera que las cosas están en el espacio de nombres predeterminado.

  • Si declara un espacio de nombres sin el identificador, es decir xmlns="http://somenamespace", en lugar de xmlns:rob="somenamespace", especifica el espacio de nombres predeterminado para el documento.

  • El espacio de nombres en sí, a menudo un IRI , no tiene ninguna consecuencia real. Debe ser único, por lo que las personas tienden a elegir un IRI / URI que poseen, pero no tiene mayor significado que eso. A veces las personas colocan el esquema (definición) para el XML en el IRI especificado, pero eso es una convención de algunas personas solamente.

  • El prefijo tampoco tiene consecuencias. Lo único que importa es en qué espacio de nombres se define el prefijo. Varias etiquetas que comienzan con diferentes prefijos, todas las cuales se asignan al mismo espacio de nombres se consideran iguales.

    Por ejemplo, si los prefijos personxmly mycityxmlambos se asignan al mismo espacio de nombres (como en el fragmento a continuación), entonces no importaría si prefijaste un elemento dado con personxmlo mycityxml, ambos serían tratados como lo mismo por un analizador XML . El punto es que a un analizador XML no le importa lo que haya elegido como prefijo, solo el espacio de nombres que asigna. El prefijo es solo una indirección que apunta al espacio de nombres.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Los atributos pueden ser calificados pero generalmente no lo son. También hacen no heredan su espacio de nombres del elemento que se encuentran, en contraposición a los elementos (véase más adelante).

Además, los espacios de nombres de elementos se heredan del elemento padre. En otras palabras, también podría haber escrito el XML anterior como

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>
Rob Levine
fuente
13
+1 respuesta conceptual buena y útil. Es posible que desee calificar "Básicamente, cada elemento (o atributo) en xml pertenece a un espacio de nombres", ya que se dice que algunos elementos y atributos están en "sin espacio de nombres". Aunque entiendo que estabas dando lo básico.
LarsH
1
@Rob Levine "Los atributos pueden tener espacios de nombres pero generalmente no". ¿Qué hay de Android?
Paul Brewczynski
1
Entonces, ¿cómo se usa, por ejemplo, " your.example.com/xml/person "? Ok, tengo una etiqueta <persona: nombre>, ¿y ahora qué? ¿Puedes explicar esto también por favor?
Koray Tugay
1
@WORMSS - Sí, tienes razón. Cuando defina su consulta, debe especificar el espacio de nombres, probablemente mediante un prefijo. En el mundo C # System.Xml, por ejemplo, registraría un prefijo con el administrador del espacio de nombres usando XmlNamespaceManager.AddNamespace, y luego usaría este prefijo en su consulta. El hecho de que el prefijo no aparezca en el documento no importa, solo qué espacio de nombres asigna.
Rob Levine
2
Este enlace de documento de Microsoft: " msdn.microsoft.com/en-us/library/aa468565.aspx " explica muy bien el espacio de nombres en XML.
Deen John
16

Creo que la mayor confusión es que el espacio de nombres xml apunta a algún tipo de URL que no tiene ninguna información. Pero la verdad es que la persona que inventó debajo del espacio de nombres:

xmlns:android="http://schemas.android.com/apk/res/android"

También podría llamarlo así:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

Esto es solo un identificador único. Sin embargo, se establece que debe colocar una URL que sea única y que potencialmente pueda apuntar a la especificación de etiquetas / atributos usados ​​en ese espacio de nombres. No es necesario aunque.

¿Por qué debería ser único? Debido a que el propósito de los espacios de nombres es tenerlos únicos para que el atributo, por ejemplo llamado fondo de su espacio de nombres, pueda distinguirse del fondo de otro espacio de nombres.

Debido a esa singularidad, no debe preocuparse de que si crea su atributo personalizado tendrá colisión de nombres.

Morfidon
fuente
Hola morfidon Por favor, ¿podría agregar en su respuesta un enlace a una referencia que especifique que el contenido o la URL pueden ser algo? ¿Qué debe ser único? También aclare la unicidad: ¿El nombre del espacio de nombres XML o el contenido de la URL? Saludos
olibre
@olibre Si desea usar el espacio de nombres de Android, debe usar su nombre. Ese es su nombre único. Decidieron poner allí una URL. Si está creando su propio espacio de nombres, puede llamarlo como quiera, solo asegúrese de que sea único. Se dice que debe usar una URL que apunte al lugar donde describe lo que está dentro de ese espacio de nombres, pero como puede ver, incluso los creadores del espacio de nombres de Android no lo hicieron.
Morfidon
Gracias Morfidon Finalmente entendí ese punto mientras leía la respuesta de Rob . Me gusta su respuesta porque destaca un aspecto importante que no se conoce bien. Pero intente mejorar su respuesta, aclare qué parte debe ser única, proporcione referencias, reformule, verifique la redacción ... Algunos lectores pueden estar confundidos por su respuesta actual. Saludos
olibre
1
¡Esta es la respuesta que necesitaba! Es confuso usar un URI para este valor de atributo, porque las personas piensan que URI = URL y esperan que algún documento resida en la ubicación. Pero AFAICT está completamente bien si el URI devuelve un 404. Es solo un identificador único que parece una dirección. Puede haber algunos validadores especiales que esperan encontrar un esquema o un DTD en esa ubicación (lo que tendría sentido), pero creo que estos son casos especiales. Corrígeme si me equivoco aquí.
brennanyoung
1
@brennanyoung es exactamente como has dicho :)
Morfidon
12

xmlns: espacio de nombres xml. Es solo un método para evitar conflictos de nombres de elementos. Por ejemplo:

<config xmlns:rnc="URI1" xmlns:bsc="URI2">
  <rnc:node>
      <rnc:rncId>5</rnc:rncId>
  </rnc:node>

  <bsc:node>
      <bsc:cId>5</bsc:cId>
  </bsc:node>
</config>

Dos nodeelementos diferentes en un archivo xml. Sin espacios de nombres, este archivo no sería válido.

Yuriy
fuente
4

Tiene espacios de nombre para que pueda tener elementos únicos a nivel mundial. Sin embargo, el 99% de las veces esto realmente no importa, pero cuando lo pones en la perspectiva de la Web Semántica , comienza a ser importante.

Por ejemplo, puede hacer una combinación XML de diferentes esquemas simplemente usando el apropiado xmlns. Por ejemplo, mezcla a un amigo con vCard , etc.

Jon
fuente
para xml trivial podría ignorarme, para todo lo demás los espacios de nombres son extremadamente importantes. + Realmente no veo la conexión entre la web semántica y el espacio de nombres. La web semántica es un concepto, el espacio de nombres es parte del estándar XML, está mezclando la definición de la interfaz y los detalles de implementación.
Newtopian