Lo primero de todo, aclarar que hace meses que no he estudiado nada de los XML, XSD y demás, así que perdón si hay alguna metedura de pata en cosas básicas. Además soy muy novato en ello, en clase nos enseñaron lo básico y, aunque saqué un 10, muchas cosas tendría que repasarlas de nuevo y aún así todo esto de los namespaces no nos lo explicaron. Nos dieron plantilla con la cabecera y ya; y a mí eso sólo me vale al principio; yo quiero aprender y entender.
Pues lo dicho, estoy tratando de enteder qué son y para qué sirven los espacios de nombres.
Lo que he creído entender de mis lecturas, es que sirve para que no haya colisión en dos etiquetas que sean iguales, no?
Bueno, pues para tratar de entenderlo, he creado un xml que se supone que es de un museo, el cuál tiene una biblioteca en la que se pueden consultar y tomar prestados libros, y una tienda en la cuál se pueden comprar libros. Tanto en la biblioteca como en la tienda habrá libros, y por tanto compartirán la misma etiqueta <libro>.
Como las necesidades de la biblioteca y la tienda son diferentes, pues por ejemplo el elemento libro de la biblioteca deberá tener un campo hijo que se llame <prestamo>, y el de la tienda otro que se llame <precio>.
La verdad que no sé si la utilidad de los namespaces sería poder referirme a uno u otro libro mediante prefijos, pero es que por más que leo, no lo pillo y no me sale.
Así que a ver. Este es el XML:
Código XML:
Ver original
<?xml version="1.0"?> <museo xmlns:tienda="http://www.google.es/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schemaBiblioteca.xsd" xmlns:biblioteca="http://www.w3.org/TR/html4/"> <biblioteca:libro> <prestamo>7</prestamo> <!-- 7 es el número de días--> </biblioteca:libro> <tienda:libro> <precio>2000</precio> </tienda:libro> </museo>
El primer libro pertenece a la biblioteca, y el segundo a la tienda.
Claro, la única forma de validar esto que se me ocurre es con un schema... ¿cual es el problema? Que o lo hago para la biblioteca, o lo hago para la tienda del museo... Dos schemas no sé si se pueden conectar al XML, y si sería solución en este caso.
Os pongo uno de ellos, el que tengo aquí enlazado, schemaBiblioteca:
Código XML:
Ver original
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="museo"> <xsd:complexType> <xsd:sequence> <xsd:element name="libro"> <xsd:complexType> <xsd:sequence> <xsd:element name="prestamo" type="xsd:integer"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
Puede que en este ejemplo concreto simplemente se pudiera dar a elegir que forzosamente hubiera uno, y sólo uno, de los dos campos (prestamo o precio), y ya... pero es que lo que yo quiero es entender cómo se puede hacer para referirise a un tipo de libro u otro mediante los namespaces, para rellenar directamente la información de un libro de biblioteca o bien de de un libro de tienda...
Otra cosa que habréis visto en el rimer código XML y que quizá os resulte graciosa es que tengo apuntando como namespace de la biblioteca la url de google... XD Es que esa es otra cosa en la que no termino de enterarme.
Resulta que de la documentación que leo (la mayoría en inglés, y por eso igual he entendido mal), deduzco que las URI que se usan como namespace, para el XML son simples cadenas y no urls, y que mientras tengan un formato URI, ya son válidas aunque luego ni existan...
Pero luego veo que muchas de esas URLS, entras a ella y tienen "algo" (los xsd y dtd en que se basan para validar, parece).
Así que entre que no termino de entender lo que es un namespace, cómo usarlo, y las urls que todavía me lían más... pues que toda ayuda será bienvenida XD
He visto tutos de Youtube, documentacion oficial, documentación de google... y nada, no me entero parece ser XD
PD: Si trato de validar el XML con el esquema que os he puesto, arroja este error (claro, el precio no forma parte del XSD de la biblioteca... pero los demás errores por los prefijos y tal, pues no sé).
Código XML:
Ver original
Validating museo.xml... file:///c:/pagina/museo.xml:6,20: Unknown element 'biblioteca:libro' file:///c:/pagina/museo.xml:10,16: Unknown element 'tienda:libro' file:///c:/pagina/museo.xml:14,9: Element 'biblioteca:libro' is not valid for content model: '(libro,)' The XML document museo.xml is NOT valid (3 errors)
Ah, traté de enlazar los dos esquemas así, pero tampoco me salía:
Código XML:
Ver original
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schemaBiblioteca.xsd" xmlns:xsi2="http://www.w3.org/2001/XMLSchema-instance2" xsi2:noNamespaceSchemaLocation="schemaTienda.xsd"
Yo que sé, dando dos espacios de nombres distintos a cada esquema, cada uno con su prefijo, y en el segundo añadiendo un 2 a la url, como he leído que da igual que no existan, que el caso es que sean únicas y diferentes...
Muchas gracias a todos los que hayáis llegado hasta aquí y perdón por el tocho.