2008-09-24 16 views
61

Esto es algo que siempre me resulta un poco difícil de explicar a los demás: ¿Por qué existen espacios de nombres XML? ¿Cuándo deberíamos usarlos y cuándo no? ¿Cuáles son las dificultades más comunes cuando se trabaja con espacios de nombres en XML?¿Para qué son los espacios de nombres XML?

Además, ¿cómo se relacionan con los esquemas XML? ¿Los esquemas XSD siempre deben estar asociados con un espacio de nombres?

Respuesta

31

Son para permitir que se combinen varios lenguajes de marcado, sin tener que preocuparse por conflictos de elementos y nombres de atributos.

Por ejemplo, mire cualquier fragmento de código XSLT, y luego piense qué pasaría si no usara espacios de nombres y tratara de escribir un XSLT donde el resultado debe contener "plantilla", "para-cada uno" , etc., elementos. Errores de sintaxis, es qué.

dejaré el asesoramiento y trampas a otros con más experiencia que yo

+1

Me sorprende que [esta falacia] (http://lists.xml.org/archives/xml-dev/200306/msg00010.html) todavía tenga influencia, 10-15 años después. También vea [esto] (http://lists.xml.org/archives/xml-dev/200305/msg00836.html) – arayq2

+1

¿Está diciendo que es falso que los espacios de nombres son una buena solución, o está diciendo que es falso que eran destinados a ser utilizados para el conflicto, y en la práctica se utilizan de esa manera (con los inconvenientes)? Solo afirmo lo último. –

+1

Estoy diciendo que los espacios de nombres XML no son una solución en absoluto. el dispositivo "resuelve" solo algunos casos de uso, pero de ningún modo todos, y además a costa de evitar una solución general, que de hecho existe, y de hecho existía incluso antes de que esta estupidez viera la luz del día. Y, por cierto, originalmente tenían "la intención" de marcar la procedencia, pero cuando se señaló que este ya era un problema resuelto, los proponentes comenzaron a mover los postes y se mantuvieron hasta que los críticos [encontraron cosas mejores que hacer con su tiempo] (http://lists.xml.org/archives/xml-dev/200305/msg00344.html). – arayq2

0

Desde el W3 recommendation ...

espacios de nombres XML proporcionan un método sencillo para el elemento de calificación y los nombres de atributos utilizados en los documentos de lenguaje de marcado extensible asociándolos con espacios de nombres identificados por las referencias URI.

+2

No responde la pregunta. La pregunta era "¿Qué son los espacios de nombres para", no "por favor dar la definición". – MarkJ

+0

Creo que hubiera sido útil dar tu punto de vista. Es posible que haya podido darle a esta persona una idea que no leyó la recomendación W3. – Jacques

0

espacios de nombres se utilizan para eliminar la ambigüedad de nombres que se utilizan en el documento. También le da la capacidad de vincular un nombre corto a un espacio de nombre que luego se puede utilizar para referirse a un elemento o atributo remoto. El espacio de nombre en sí se refiere a la ubicación que define los elementos y atributos que utiliza en el documento. Hay mucho más por saber, pero ese es el corazón de eso. Hay mucha más información here.

16

que es casi lo mismo que preguntar "¿por qué utilizamos paquetes para Java/C#?":

  • reutilización: Puede volver a utilizar un conjunto de etiquetas/atributos que definen a través de diferentes tipos de documentos XML .
  • modularidad: Si necesita agregar algún "aspecto" a su XML; agregar un espacio de nombres a su documento xml es más simple que cambiar la definición de su esquema xml completo.
  • Evite la contaminación del espacio de nombres "principal": No fuerce a su analizador para trabajar con una gran definición de esquema, solo use el espacio de nombres que necesita.
+1

Hola Nathan. No, eso no tiene sentido para mí. La reutilización no parece aplicarse aquí ... También lucho con el propósito de los espacios de nombres. En XHTML encontraría un espacio de nombres allí, el propósito del cual me imagino es dirigir el navegador sobre cómo desea que se represente la página. Pero en algo como SOAP, donde un contrato de mensaje hace uso de un espacio de nombres ... No veo dónde entra su uso. – Jacques

1

Por ejemplo: XML Namespaces by Example

En mis palabras: Si tiene que usar algún formato XML para la empresa externa (por ejemplo) y hay que proporcionar en el documento XML algunas informaciones, que tiene mismo nombre, se necesita una espacio de nombres Ejemplo:

<sampleDoc> 
    <header title="Hello world!"> 
     <items> 
     <item name="Volvo" color="Blue"/> 
     </items> 
    </header> 
</sampleDoc> 

y quiere fusionar algunos datos en este documento, que tiene un mismo nombre, pero otro sentido (así valor a), se debe utilizar un espacio de nombres:

<sampleDoc> 
    <header title="Hello world!"> 
     <items> 
     <item name="Volvo" color="White" my_unique_namespace:color="#FFFFFF"/> 
     </items> 
    </header> 
</sampleDoc> 

Por supuesto - puedes cambiar un nombre de atributo. Por ejemplo a "my_unique_color". Bud en otro documento, puede haber un atributo con el mismo nombre nuevamente.Por lo tanto, si tiene un espacio de nombre exclusivo (nuestro dominio web, por ejemplo), siempre puede usar los mismos nombres de elementos y/o atributos sin ningún problema.

+0

¡Una explosión del pasado! Hace bastante tiempo, ese mismo artículo fue el trampolín para un [largo hilo en la lista xml-dev] (http://lists.xml.org/archives/xml-dev/200305/threads.html#00787). El ejemplo realmente puede mostrar [algo más] (http://lists.xml.org/archives/xml-dev/200305/msg00840.html). Desafortunadamente, el [punto esencial] (http://lists.xml.org/archives/xml-dev/200306/msg00036.html) se perdió en la mayoría de las personas, y el mismo punto ciego persiste hasta el día de hoy. – arayq2

5

Piense en ellos como apellidos para los tipos de elementos. Si tienes dos amigos, ambos llamados Bob, y estás hablando de uno de ellos, alguien podría preguntarte de qué Bob estás hablando. Solo decir "Bob" no es muy útil, entonces dices "Bob Smith" o "Bob Jones".

Lo mismo ocurre con los tipos de elementos. A veces, un nombre corto no es suficiente, porque diferentes personas pueden elegir el mismo nombre. Entonces incluye un URI como un "apellido", para distinguir entre los diferentes Bobs.

5

XML es un superlengua, lo que significa que es la base de cualquier lenguaje basado en XML (tiene sentido, ¿no?). Piense en XML como una pluma que puede escribir cualquier oración, en cualquier idioma. Todo depende del escritor, y preferiblemente el lenguaje debe ser conocido por el lector.

Un XML namespace es básicamente el nombre del idioma, al igual que "Inglés" o "עברית". Ayudo al destinatario del documento XML para analizarlo y extraer la información dentro.

Digamos que tengo una fábrica de muebles y usted tiene una tienda de muebles. la aplicación de almacenamiento y mi solicitud de suministro no tienen ninguna relación, pero cuando se comunican a través de mensajes XML, los mensajes deben ser comprensibles y fácilmente analizada por ambos lados

Por lo tanto, ambos sistemas necesitan conocer los esquema, que define el lenguaje sintaxis y restricciones acordadas. Piense en el esquema como el diccionario y el libro de texto de la gramática. El esquema es el documento que ambos sistemas deben saber, que quien escribe el código de análisis en cada sistema debe saber, y eso incluye la declaración del espacio de nombres.

Cada espacio de nombre se denomina URI, que en la mayoría de los casos es la ubicación del documento de esquema que lo define.

Por supuesto, no todos los documentos XML necesitan un espacio de nombre, especialmente cuando no se utiliza para transmitir información a un sistema remoto. Por ejemplo, cuando serializa objetos en XML para persistir en su base de datos.

+1

El esquema no es necesario para que un espacio de nombres sea útil. – stephbu

+0

Bueno, si no se realiza la validación, seguro. Pero entonces, ¿para qué es el espacio de nombres?= 8-) – Yuval

12

El mayor error en mi humilde opinión es la interacción humana, documentos de interpretación, por ejemplo. Desarrollar código para procesar un documento XML. Es demasiado fácil enfocarse en la expresión literal del documento en lugar del resultado del conjunto de información del análisis del documento.

p. Ej. los siguientes nodos

<a xmlns="uri:foo"/> 
<foo:a xmlns:foo="uri:foo"/> 
<bar:a xmlns:bar="uri:foo"/> 

son todos semánticamente idénticos, pero muy diferentes al ojo ingenuo.

El primer ejemplo produce un error muy común al desarrollar XPaths, sin tener en cuenta el hecho de que "a" está en un espacio de nombres, por lo tanto // no produce coincidencias. (o, peor aún, haciendo coincidir los nodos en un espacio de nombres diferente!)

El tercer ejemplo abre otro defecto en la comprensión: que el texto del prefijo es semánticamente significativo. Al analizar documentos con XPATH, puedo declarar cualquier prefijo que me guste para la coincidencia, siempre que su uri coincida con el del documento.

3

Utilizamos espacios de nombres porque la gente xeep queriendo usar las mismas palabras para significar cosas diferentes en su propio Idaho privado. Por lo general, puedes determinar desde el contexto lo que quiere decir una persona. En una base de datos de personal, el XML es registros de personal. En una base de datos de registro de vehículos, el XML es registros de registro de vehículos.

Ambos mantienen una etiqueta llamada "ubicación", pero la etiqueta significa cosas diferentes para cada uno y contiene campos diferentes.

Ahora, eso es genial: ¿pero qué sucede si necesita o quiere almacenar XML de ambos en la misma base de datos? O, lo que es más interesante, ¿qué pasa si ambas bases de datos desean almacenar fragmentos XML de alguna otra base de datos común (por ejemplo, una base de datos de Cuentas).

espacios de nombres XML asocian con cada etiqueta XML un URI, de modo que el nombre de la etiqueta tiene una url delante, eso es parte del nombre de la etiqueta (por supuesto, los documentos XML actuales usan una taquigrafía). Al elegir cuidadosamente el URI, es fácil estar seguro de que los nombres de las etiquetas no colisionarán, es como si las dos etiquetas de ubicación fueran nombradas de manera completamente diferente, por lo que no hay confusión. Como beneficio adicional, las dos etiquetas de ubicación completamente diferentes pueden incluir elementos de la base de datos de cuentas y declarar explícitamente que están hablando de lo mismo.

Lo que hace que todo esto sea útil es XPATH.

Con lo anterior, puede comenzar a escribir expresiones XPATH que digan cosas como: encuentre las secciones accounts:account overdue en cualquier parte de este xml. O bien: encuéntreme cualquier elemento accounts:warning message en cualquier parte de este fragmento particular de XML, donde el mensaje de advertencia es un nodo secundario (sin importar la profundidad) de un nodo personnel:payment o un nodo vehicle:status.

Esa expresión XPATH puede usarse en algún lugar de un documento XSLT, cuyo trabajo es convertir el XML en XHTML o XPDF, para su visualización.

¿Cuál es la recompensa? ¿Por que hacerlo? Como puede buscar en el archivo de registro XML, extraiga todas las cuentas vencidas donde aparezcan, sin confundirlas con etiquetas de "mensaje" producidas por otros sistemas, conviértalas a xhtml y visualícelas en negrita roja a través de una etiqueta css : todo sin escribir un trozo de código de procedimiento.

+0

[Nada de esto (especialmente acerca de xpaths) es necesariamente verdadero] (http://lists.xml.org/archives/xml-dev/200305/msg00864.html). – arayq2

+0

Mi comprensión de esta respuesta es que el espacio de nombres de XML es esencialmente una etiqueta para agrupar o identificar un grupo de elementos XML. – KMC

13

¿Por qué existen espacios de nombres XML?

Porque, en 1997, algunas personas muy influyentes en el W3C las querían, y no aceptaron un no por respuesta. Incluso cuando se demostró, me atrevo a decir de manera concluyente, que había mejores formas de resolver el "problema" que pensaban que tenían, todavía ejercen su influencia para que sus deseos se escriban en una Recomendación del W3C.

La mayor mentira en la extensa mitología actual que rodea a los espacios de nombres XML es que tiene mérito técnico. (Este es el efecto descendente de una Recomendación que simplemente existe y ocupa el espacio mental: "¡Caramba, debe haber una (buena) razón!", En lugar de una nota al pie forjable en algún lugar).

Much pain, no gain.

¿Cuándo deberíamos usarlos y cuándo no?

Nunca debe utilizarlos si puede evitarlo. Desafortunadamente, la promoción implacable de este dispositivo BAD [*] por parte de las partes interesadas ha fomentado un clusterf * ck de especificaciones hoy que hacen que sea prácticamente imposible no tener que lidiar con espacios de nombres XML en algún momento u otro. Por lo tanto, incluso si evita los espacios de nombres XML usted mismo, encontrará una porquería incrustada en el espacio de nombres que viene de todas partes o, lo que es peor, de los conjuntos de herramientas que simplemente se niegan a trabajar a menos que los alimente con tanta crudeza.

¿Cuáles son los inconvenientes más comunes al trabajar con espacios de nombres en XML?

Un error muy común es el uso de expresiones Xpath con documentos donde un espacio de nombre ha sido "predeterminado": el espacio de nombres tendrá que ser explícito en las expresiones. Otro problema es usarlos "correctamente" al construir documentos: they create problems out of thin air.

Además, ¿cómo se relacionan con los esquemas XML? ¿Los esquemas XSD siempre deben estar asociados con un espacio de nombres?

No hay ninguna relación necesaria, excepto que la especificación del esquema XSD se desarrolló en un momento en el que casi todos en el comité tenían los espacios de nombres XML en sus dientes. Entonces lo trabajaron tan profundamente como pudieron. Sin embargo, es posible usar esquemas XSD sin espacios de nombres, pero es una tarea difícil porque casi todos los juegos que soportan esquemas XSD asumen que "querrás" usar espacios de nombres.

[*] = BAD mal diseñada

ACTUALIZACIÓN: An old essay on this non-solution to a non-problem.

+0

Estoy de acuerdo con el sentimiento, de todo corazón, si no del todo al nivel de entusiasmo de arayq2. Sin embargo, aclararía las trampas que he encontrado: 1) – Abacus

+1

1) Es difícil deshacerse de los espacios de nombres. Al menos con las herramientas .Net que he estado usando, no es trivial eliminar espacios de nombres de un objeto xml. "Una vez que comiences por el camino oscuro, siempre dominará tu destino" 2) Las implementaciones varían; la sintaxis XPath no siempre se implementa de la misma manera (al igual que la expresión regular tiene diferentes sabores. 3) ¡Complejidad! Y si no crees que cualquier complejidad innecesaria es una gran trampa, entonces ignora todo lo que dije. – Abacus

+0

ah, finalmente, un tic-down sin comentario. Debo haber herido un sentimiento. – arayq2

Cuestiones relacionadas