1 00:00:00,880 --> 00:00:12,339 Uno de los aspectos más importantes de un fichero XML, sobre todo si es muy grande, si es extenso, es cómo buscar dentro de él, cómo obtener información buscando en él. 2 00:00:12,519 --> 00:00:17,379 Algo así como cuál es ese lenguaje SQL, pero aplicado a XML. 3 00:00:17,820 --> 00:00:19,920 Y ese lenguaje se llama XPath. 4 00:00:20,579 --> 00:00:21,300 Vamos a ir a eso. 5 00:00:21,300 --> 00:00:27,760 Lo primero que tenemos que entender es que un documento XML es un grafo. 6 00:00:27,960 --> 00:00:30,280 Un grafo en forma de árbol. 7 00:00:30,879 --> 00:00:39,899 Es decir, donde empezamos en un elemento raíz, que es la primera etiqueta, el primer elemento que arranca nuestro fichero XML, 8 00:00:40,380 --> 00:00:45,979 y poco a poco vamos descendiendo a través de nodos hijos para mostrar toda la información. 9 00:00:46,500 --> 00:00:52,359 El primer elemento es el elemento raíz, el segundo es cualquier elemento, dentro de este habrá atributos, 10 00:00:53,039 --> 00:01:00,039 dentro de cualquier elemento puede haber textos, puede haber comentarios, instrucciones de procesamiento y un espacio de nombres. 11 00:01:00,039 --> 00:01:13,319 Si tuviéramos el ejemplo que hemos estado viendo hasta ahora, este de aquí, veremos que esta primera definición no se considera ni siquiera nada, simplemente nos indica características de lo que viene posteriormente. 12 00:01:14,060 --> 00:01:26,200 Biblioteca es el elemento raíz, dentro de ello hay varios libros y dentro de cada libro, título, autor y fecha de publicación, con o sin atributos. 13 00:01:26,980 --> 00:01:32,920 Es decir, esta información, si la pusiéramos en forma de grafo, correspondería a esto de aquí. 14 00:01:33,200 --> 00:01:42,280 Raíz, biblioteca, libro, libro, libro, título, autor, fecha de publicación, título, autor, fecha de publicación, título, autor, fecha de publicación. 15 00:01:42,280 --> 00:01:50,859 E incluso el autor, en este caso, por ejemplo, sería simplemente su nombre, y en este caso, indicaría su fecha de nacimiento y su nombre. 16 00:01:51,500 --> 00:01:54,920 Bueno, con esto vemos un ejemplo de cómo es esa estructura. 17 00:01:54,920 --> 00:02:04,359 A partir de aquí podemos ir construyendo una serie de características para buscar dentro del XML. 18 00:02:05,120 --> 00:02:13,900 Vamos a empezar por el primer elemento que es el eje principal, es decir, por dónde comienza la raíz de este documento. 19 00:02:14,400 --> 00:02:19,180 Y esto se representa simplemente con la barra, una barra inclinada. 20 00:02:19,180 --> 00:02:23,599 Entonces esto simplemente nos está diciendo que estamos en el arranque. 21 00:02:23,599 --> 00:02:38,460 Entonces, si nosotros definimos arranque biblioteca, arranque libro, arranque autor, estamos refiriéndonos a cada uno de los autores de libros que están en el arranque biblioteca. 22 00:02:38,800 --> 00:02:49,740 Si vemos aquí, pues vamos a ir viendo los autores y veremos que sería Milán Kundera, Mario Vargas Llosa y otra vez Mario Vargas Llosa. 23 00:02:49,740 --> 00:02:56,120 bueno, vamos a ver que efectivamente esta es la información que aquí estamos obteniendo 24 00:02:56,120 --> 00:03:00,740 sin embargo, si pusiéramos raíz autor, pues no tendríamos ninguna información 25 00:03:00,740 --> 00:03:06,120 puesto que directamente en raíz no está la etiqueta autor 26 00:03:06,120 --> 00:03:10,000 si pusiéramos biblioteca autor, lo mismo nos ocurriría 27 00:03:10,000 --> 00:03:14,139 porque biblioteca y dentro directamente autor no está, por delante está libro 28 00:03:14,139 --> 00:03:30,819 Y si pusiéramos biblioteca, libro, autor y el atributo que se indica con esta arroba fecha de nacimiento, pues obtendríamos las fechas de nacimiento que existen en el documento, que son esta de aquí y esta de aquí. 29 00:03:31,659 --> 00:03:35,060 En este caso coinciden porque corresponden al mismo autor. 30 00:03:35,060 --> 00:03:40,780 Así también podemos buscar biblioteca, libro y este atributo 31 00:03:40,780 --> 00:03:44,800 Pero veríamos que dentro del libro no existe el atributo 32 00:03:44,800 --> 00:03:47,080 Existe el atributo dentro del autor 33 00:03:47,080 --> 00:03:53,039 Con lo cual podemos ir viendo desde raíz recorriendo el camino hasta la información 34 00:03:53,039 --> 00:03:58,400 Con dos barras lo que estamos indicando es todos los descendientes que cumplen esas condiciones 35 00:03:58,400 --> 00:04:04,280 Por ejemplo, dentro de biblioteca, dentro de la raíz biblioteca queremos todos los autores 36 00:04:04,280 --> 00:04:22,959 Muy bien, pues aquí están. Incluso, podríamos prescindir de la teca. Dame todos los autores que haya. Pues aquí están todos. O, dame todos los autores y dentro todos los libros. Y claro, vemos que no existe porque dentro de autor no hay nunca un libro. 37 00:04:22,959 --> 00:04:27,860 Si seguimos, dame todos los atributos año 38 00:04:27,860 --> 00:04:32,399 Pues aquí están todos los atributos año que hay en nuestro fichero 39 00:04:32,399 --> 00:04:35,620 Unos corresponden a la fecha de publicación, estos de aquí 40 00:04:35,620 --> 00:04:37,040 ¿Vale? 41 00:04:38,420 --> 00:04:38,980 Bien 42 00:04:38,980 --> 00:04:43,899 Con dos puntos, igual que custodiamos en el sistema operativo en directorios 43 00:04:43,899 --> 00:04:45,920 Estamos hablando del elemento padre 44 00:04:45,920 --> 00:04:47,540 Entonces nosotros podríamos decir 45 00:04:47,540 --> 00:04:50,759 Dame todo lo que esté en la raíz biblioteca 46 00:04:50,759 --> 00:04:53,920 Dentro libro, dentro autor, dentro de la atributo fecha de nacimiento 47 00:04:53,920 --> 00:04:55,980 Y ahora sube hacia arriba un nivel 48 00:04:55,980 --> 00:04:58,120 Que volveríamos otra vez al autor 49 00:04:58,120 --> 00:05:02,199 De aquellos que tienen fecha, atributo, fecha de nacimiento 50 00:05:02,199 --> 00:05:03,319 Que son estos dos de aquí 51 00:05:03,319 --> 00:05:06,860 Vemos que no me está recuperando este primero 52 00:05:06,860 --> 00:05:10,199 Este primero, mi gran cundera 53 00:05:10,199 --> 00:05:14,420 Del cual no tenemos un atributo fecha de nacimiento 54 00:05:14,420 --> 00:05:17,199 Los demás sí me lo recuperan 55 00:05:17,199 --> 00:05:20,540 O devuélveme todos los atributos de fecha de nacimiento 56 00:05:20,540 --> 00:05:21,980 subiendo dos niveles 57 00:05:21,980 --> 00:05:24,300 es decir, todos los libros de ADIAN 58 00:05:24,300 --> 00:05:26,079 que tienen fecha de nacimiento 59 00:05:26,079 --> 00:05:28,339 en este caso esto es lo de aquí 60 00:05:28,339 --> 00:05:31,019 con la barra indicamos 61 00:05:31,019 --> 00:05:33,579 pues como clásicamente se hace en informática 62 00:05:33,579 --> 00:05:34,500 la O 63 00:05:34,500 --> 00:05:36,720 devuélveme estos 64 00:05:36,720 --> 00:05:38,800 o estos, todos ellos 65 00:05:38,800 --> 00:05:39,259 ¿vale? 66 00:05:40,720 --> 00:05:42,740 y así podemos ir buscando 67 00:05:42,740 --> 00:05:45,600 información que esté dentro 68 00:05:45,600 --> 00:05:47,339 de nuestro XML 69 00:05:47,339 --> 00:05:49,379 además podemos poner condiciones 70 00:05:49,379 --> 00:05:53,879 Por ejemplo, podemos indicar también los elementos que tienen un atributo 71 00:05:53,879 --> 00:05:56,660 Queremos todos los autores que tienen fecha de nacimiento 72 00:05:56,660 --> 00:05:59,120 Esto era muy parecido a algo que hemos hecho anteriormente 73 00:05:59,120 --> 00:06:03,019 O incluso, devuélveme el primer libro que haya 74 00:06:03,019 --> 00:06:08,079 O el último, last, entre paréntesis 75 00:06:08,079 --> 00:06:10,019 Es decir, como una función 76 00:06:10,019 --> 00:06:12,519 Devuélveme el último libro 77 00:06:12,519 --> 00:06:15,620 O el último libro menos uno 78 00:06:15,620 --> 00:06:22,740 Con lo cual podemos ahí realizar pequeñas funciones matemáticas para poder buscar elementos. 79 00:06:23,160 --> 00:06:32,819 O conducciones más complejas, devuélvame las fechas de publicaciones cuyo año sea mayor que 1970, que me devolvería esto de aquí. 80 00:06:33,579 --> 00:06:42,040 O aquellos libros cuyo autor sea igual a Mario Vargas Llosa, con lo cual me aparecerían esos libros concretos. 81 00:06:42,040 --> 00:06:46,000 Incluso con el punto puedo referenciar donde estoy exactamente 82 00:06:46,000 --> 00:06:47,519 Devuélveme el atributo año 83 00:06:47,519 --> 00:06:49,959 Donde el propio atributo año 84 00:06:49,959 --> 00:06:51,579 Sea mayor que 1970 85 00:06:51,579 --> 00:06:53,420 Aquí estamos 86 00:06:53,420 --> 00:06:55,620 O donde el propio autor 87 00:06:55,620 --> 00:06:56,800 Sea Mario Vargas Llosa 88 00:06:56,800 --> 00:06:57,860 Aquí lo tenemos 89 00:06:57,860 --> 00:06:59,980 O condiciones más complejas 90 00:06:59,980 --> 00:07:01,860 Devuélveme los libros 91 00:07:01,860 --> 00:07:03,779 Cuyo autor sea Mario Vargas Llosa 92 00:07:03,779 --> 00:07:06,259 Y la fecha de publicación 93 00:07:06,259 --> 00:07:07,740 Su año sea el 73 94 00:07:07,740 --> 00:07:09,459 En este caso 95 00:07:09,459 --> 00:07:10,860 Cambiamos la condición 96 00:07:10,860 --> 00:07:14,019 AND por la condición OR. 97 00:07:16,519 --> 00:07:23,180 Bueno, incluso encadenar aquellos que cumplen que el autor sea Mario Vargas Llosa 98 00:07:23,180 --> 00:07:26,300 y la fecha de publicación sea el 73. 99 00:07:27,139 --> 00:07:31,259 Con esto podemos establecer montones de búsquedas sobre el fichero. 100 00:07:32,500 --> 00:07:35,180 Una pequeña diferencia es cuando quiero devolver el nodo, 101 00:07:35,319 --> 00:07:37,540 que es lo que estamos devolviendo la mayoría de las veces anteriores, 102 00:07:37,540 --> 00:07:43,959 O cuando quiero devolver el texto, que es simplemente la parte que está adentro de las etiquetas. 103 00:07:44,639 --> 00:07:55,540 Y además el valor del asterisco, que es todos los hijos o todos los descendientes según si se lo aplico a la barra o si se lo aplico a la doble barra. 104 00:07:56,500 --> 00:07:58,319 Entonces aquí podríamos ver ejemplos. 105 00:07:58,319 --> 00:08:07,879 También todos los atributos, me da igual que se aplique a la raíz del documento o a doble barra, es decir, a todos los elementos descendientes 106 00:08:07,879 --> 00:08:16,920 Así podemos ir complicando las búsquedas, indicando elementos de este tipo 107 00:08:17,839 --> 00:08:24,079 Devuélveme la ficha de publicación de todos los que cumplan que el año es mayor que el 1970 108 00:08:24,079 --> 00:08:28,620 Sube un nivel hacia arriba y me devuelve su título 109 00:08:28,620 --> 00:08:31,040 Tendríamos este resultado 110 00:08:31,040 --> 00:08:36,980 O devuélveme todos los libros cuyo autor es Mario Vargas Llosa 111 00:08:36,980 --> 00:08:41,399 Con lo cual me devolvería completamente el nodo libro de todos esos documentos 112 00:08:41,399 --> 00:08:44,019 En este caso incluso podríamos decir 113 00:08:44,019 --> 00:08:48,220 Devuélveme de ese autor todo lo que haya por encima 114 00:08:48,220 --> 00:08:50,840 Y llegaríamos a la misma solución en este caso 115 00:08:50,840 --> 00:08:55,340 O todos los que se han publicado en 1969 116 00:08:55,340 --> 00:08:57,580 Su autor 117 00:08:57,580 --> 00:09:20,639 Y entonces pues veríamos esta información de así. Aquí ya vemos que esto se puede decir de muy diversas maneras. O expresiones anidadas. Entonces con este mismo documento podemos decir devuélveme el libro cuyo título en la vida está en otra parte y devuélveme el año de su fecha de publicación. Esto es lo que me devolvería. 118 00:09:20,639 --> 00:09:25,899 O la fecha de publicación cuyo año es el 73 119 00:09:25,899 --> 00:09:30,600 Devuélveme todos sus libros y de ellos solamente el título 120 00:09:30,600 --> 00:09:33,200 Con lo cual tendríamos esta información 121 00:09:33,200 --> 00:09:37,980 Bueno, ya la complejidad en que fuéramos incluyendo diversos elementos 122 00:09:37,980 --> 00:09:42,419 Pues va a depender básicamente de nuestra habilidad a la hora de buscar 123 00:09:42,419 --> 00:09:50,919 ¿Cómo podemos probar todos estos programas? 124 00:09:51,039 --> 00:09:53,360 Pues voy a copiar esta información de aquí 125 00:09:53,360 --> 00:10:01,700 Y me la voy a llevar a un programa que me permite testar, probar estas entradas 126 00:10:01,700 --> 00:10:04,580 Voy a copiarlo aquí, esta información 127 00:10:04,580 --> 00:10:07,240 La copio aquí, toda la información de este ejemplo 128 00:10:07,240 --> 00:10:12,700 Y yo ahora puedo decirle una expresión xpad y probarla 129 00:10:12,700 --> 00:10:14,879 Voy a decir que no me incluya nada raro 130 00:10:14,879 --> 00:10:18,980 Y yo podría decir simplemente devuélveme, por ejemplo, para probarlo 131 00:10:18,980 --> 00:10:20,860 Que me devuelva todos los títulos 132 00:10:20,860 --> 00:10:22,779 y yo voy a text 133 00:10:22,779 --> 00:10:24,000 xpath 134 00:10:24,000 --> 00:10:26,340 y cuando lo pruebe 135 00:10:26,340 --> 00:10:27,860 me va a devolver 136 00:10:27,860 --> 00:10:30,899 efectivamente los títulos 137 00:10:30,899 --> 00:10:31,480 ¿de acuerdo? 138 00:10:31,879 --> 00:10:33,799 por ejemplo puedo probar también 139 00:10:33,799 --> 00:10:35,360 pues yo que sé, todo aquello 140 00:10:35,360 --> 00:10:37,159 todos los títulos 141 00:10:37,159 --> 00:10:39,019 en los cuales 142 00:10:39,019 --> 00:10:42,820 puedo probar todas las aplicaciones 143 00:10:42,820 --> 00:10:43,779 cuya fecha 144 00:10:43,779 --> 00:10:45,940 de publicación 145 00:10:45,940 --> 00:10:48,120 su año 146 00:10:48,120 --> 00:10:50,740 el atributo año 147 00:10:50,740 --> 00:10:53,759 sea igual a 1973 148 00:10:53,759 --> 00:10:55,759 y de estos 149 00:10:55,759 --> 00:10:57,840 quiero saber 150 00:10:57,840 --> 00:10:59,620 subiendo 151 00:10:59,620 --> 00:11:00,519 cuál es su título 152 00:11:00,519 --> 00:11:02,480 podría probar esta información 153 00:11:02,480 --> 00:11:04,100 testear 154 00:11:04,100 --> 00:11:06,500 y me saldría aquí 155 00:11:06,500 --> 00:11:09,179 pues efectivamente la misma información que teníamos 156 00:11:09,179 --> 00:11:10,899 antes o muy parecida 157 00:11:10,899 --> 00:11:12,299 etcétera, etcétera 158 00:11:12,299 --> 00:11:14,059 es decir, hay una serie de 159 00:11:14,059 --> 00:11:17,059 aplicaciones que nos permiten formatear 160 00:11:17,059 --> 00:11:18,019 y probar 161 00:11:18,019 --> 00:11:19,519 XPath 162 00:11:19,519 --> 00:11:38,000 De acuerdo, en este caso hemos utilizado freeformature.com para probarlo, pero existe un montón de más e incluso existen editores que permiten hacer búsquedas por XPath y es muy interesante utilizarlo para probar nuestros ejemplos.