
Con este conjunto de ejercicios XPath podrás poner en práctica las habilidades aprendidas en el tutorial de XPath. Aprenderás a navegar y buscar elementos en documentos XML utilizando diferentes ejes, predicados y funciones XPath. Recuerda que, tanto las herramientas online como las instaladas en tu equipo, pueden no estar actualizadas y que no soporten algunas funciones.
1. Ejercicios XPath: prácticas resueltas
1.1. Ejercicio resuelto: Catálogo de libros
Dado el siguiente documento XML que representa un catálogo de libros:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book>
<title>XML in Practice</title>
<author>Joe Marini</author>
<year>2002</year>
<price>39.95</price>
</book>
<book>
<title>Learning XPath</title>
<author>John Smith</author>
<year>2010</year>
<price>29.99</price>
</book>
<book>
<title>Advanced XML Techniques</title>
<author>Lisa Johnson</author>
<year>2015</year>
<price>49.99</price>
</book>
</catalog>
Escribe consultas XPath para resolver las siguientes preguntas:
- Obtén el título de todos los libros.
- Encuentra el autor de los libros publicados después de 2005.
- Obtén los títulos de los libros escritos por autores cuyo nombre comienza con la letra «J».
- Encuentra el elemento
<year>del libro cuyo título contiene la palabra ‘XPath’.
Solución:
- Consulta XPath:
//title/text()
Resultado: «XML in Practice», «Learning XPath», «Advanced XML Techniques» - Consulta XPath:
//book[ year > 2005] /author/text()
Resultado: «John Smith», «Lisa Johnson» - Consulta XPath:
//book[starts-with(author, 'J')]/title/text()
Resultado: «XML in Practice», «Learning XPath» - Consulta XPath:
//book[contains(title, 'XPath')]/year
Resultado: «<year>2010</year>»
1.2. Ejercicio resuelto: Lista de estudiantes
Dado el siguiente documento XML que representa una lista de estudiantes y sus calificaciones:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>John Smith</name>
<grades>
<grade subject="Math">85</grade>
<grade subject="Science">92</grade>
<grade subject="History">78</grade>
</grades>
</student>
<student>
<name>Alice Johnson</name>
<grades>
<grade subject="Math">90</grade>
<grade subject="Science">87</grade>
<grade subject="History">92</grade>
</grades>
</student>
<student>
<name>Emma Davis</name>
<grades>
<grade subject="Math">95</grade>
<grade subject="Science">88</grade>
<grade subject="History">91</grade>
</grades>
</student>
</students>
Escribe consultas XPath para resolver las siguientes preguntas:
- Obtén el nombre de todos los estudiantes.
- Encuentra el promedio de calificaciones de todos los estudiantes en Matemáticas (Math).
- Obtén el elemento <name> de los estudiantes que tienen una calificación de Historia (History) mayor a 80.
Solución:
- Consulta XPath:
name/text()
Resultado: Not found - Consulta XPath:
/name/text()
Resultado: Not found - Consulta XPath:
//name/text()
Resultado: «John Smith», «Alice Johnson», «Emma Davis» - Consulta XPath:
sum(//grade[@subject='Math']) div count(//grade[@subject='Math'])
Resultado: «90» - Consulta XPath:
//student[grades/grade[@subject='History'] > 80]/name/text()
Resultado: «Alice Johnson», «Emma Davis» - Consulta XPath:
//student[grades/grade[@subject='History'] > 80]/name
Resultado: «<name>Alice Johnson</name>» «<name>Emma Davis</name>»
1.3. Ejercicio resuelto: Lista de empleados
Dado el siguiente documento XML que representa una lista de empleados de una empresa:
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<name>John Smith</name>
<age>35</age>
<department>IT</department>
<salary>50000</salary>
</employee>
<employee>
<name>Alice Johnson</name>
<age>28</age>
<department>HR</department>
<salary>45000</salary>
</employee>
<employee>
<name>Michael Davis</name>
<age>42</age>
<department>Finance</department>
<salary>60000</salary>
</employee>
<employee>
<name>Sarah Brown</name>
<age>31</age>
<department>IT</department>
<salary>55000</salary>
</employee>
</employees>
Escribe consultas XPath para resolver las siguientes preguntas:
- Obtén el elemento <name> de todos los empleados del departamento de IT.
- Encuentra la edad promedio de los empleados en el departamento de HR.
- Encuentra el salario más alto entre todos los empleados.
- Obtén el elemento <name> del empleado más joven.
- Encuentra el nombre de los empleados que tienen un salario mayor a 50000 y pertenecen al departamento de IT.
Solución:
- Consulta XPath:
//employee[department = 'IT']/name
Resultado: «<name>John Smith</name>» «<name>Sarah Brown</name>» - Consulta XPath:
sum(//employee[department = 'HR']/age) div count(//employee[department = 'HR'])
Resultado: «28» - Consulta XPath:
max(//salary)
Resultado: «60000» - Consulta XPath:
//employee[age = min(//employee/age)]/name
Resultado: «<name>Alice Johnson</name>» - Consulta XPath:
//employee[salary > 50000 and department = 'IT']/name/text()
Resultado: «John Smith», «Sarah Brown»
1.4. Ejercicio resuelto: Lista de aulas
Dado el siguiente documento XML que representa una lista de aulas de una escuela:
<?xml version="1.0" encoding="UTF-8"?>
<school>
<classroom id="101" floor="1">
<name>Math Classroom</name>
<furniture>
<chairs>30</chairs>
<desks>15</desks>
<tables>5</tables>
</furniture>
<equipment>
<windows>4</windows>
<whiteboards>2</whiteboards>
<computers>20</computers>
<lockers>10</lockers>
</equipment>
</classroom>
<classroom id="201" floor="2">
<name>Science Laboratory</name>
<furniture>
<chairs>24</chairs>
<desks>12</desks>
<tables>8</tables>
</furniture>
<equipment>
<windows>6</windows>
<whiteboards>1</whiteboards>
<microscopes>10</microscopes>
<safetyShowers>1</safetyShowers>
</equipment>
</classroom>
<classroom id="301" floor="3">
<name>Language Arts Classroom</name>
<furniture>
<chairs>25</chairs>
<desks>20</desks>
<tables>6</tables>
</furniture>
<equipment>
<windows>3</windows>
<whiteboards>2</whiteboards>
<computers>15</computers>
<bookshelves>5</bookshelves>
</equipment>
</classroom>
<classroom id="401" floor="4">
<name>History Classroom</name>
<furniture>
<chairs>28</chairs>
<desks>18</desks>
<tables>7</tables>
</furniture>
<equipment>
<windows>5</windows>
<whiteboards>3</whiteboards>
<computers>12</computers>
<lockers>8</lockers>
</equipment>
</classroom>
</school>
Escribe consultas XPath para resolver las siguientes preguntas:
- Obtén el nombre de todas las aulas en el segundo piso.
- Encuentra el número total de sillas en todas las aulas.
- Encuentra el número de ventanas en el aula de Language Arts.
- Encuentra el número promedio de ordenadores total.
- Obtén el nombre de las aulas que tienen más de 26 sillas.
Solución:
- Consulta XPath:
/school/classroom[@floor='2']/name/text()- Resultado: «Science Laboratory»
- Consulta XPath:
sum(//chairs)- Resultado: 79
- Consulta XPath:
/school/classroom[name='Language Arts Classroom']/equipment/windows/text()- Resultado: 3
- Consulta XPath:
sum(//computers)- Resultado: 47
- Consulta XPath:
/school/classroom[furniture/chairs > 26]/name/text()- Resultado: «Math Classroom», «History Classroom»
2. Ejercicios XPath: ejemplos tipo examen
2.1. Ejemplo examen: Consultas XPath para un catálogo de libros
Dado el documento XML, escribe consultas XPath para recuperar la siguiente información:
- Selecciona los títulos de todos los libros.
- Selecciona los autores de los libros publicados por Addison-Wesley.
- Selecciona los títulos de libros publicados después de 2010.
- Selecciona el autor del libro titulado «Introduction to Algorithms.».
- Selecciona los años de todos los libros.
- Selecciona los títulos de libros publicados por MIT Press.
- Selecciona los autores de libros publicados antes de 2000.
- Selecciona los títulos de libros publicados por Prentice Hall o Addison-Wesley.
- Selecciona los títulos de libros con una longitud de título superior a 30 caracteres.
- Selecciona los títulos de libros donde el nombre del autor comience con «R».
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book>
<title>Clean Code: A Handbook of Agile Software Craftsmanship</title>
<author>Robert C. Martin</author>
<year>2008</year>
<publisher>Prentice Hall</publisher>
</book>
<book>
<title>Introduction to Algorithms</title>
<author>Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein</author>
<year>2009</year>
<publisher>MIT Press</publisher>
</book>
<book>
<title>Design Patterns: Elements of Reusable Object-Oriented Software</title>
<author>Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides</author>
<year>1994</year>
<publisher>Addison-Wesley</publisher>
</book>
<book>
<title>Effective Java</title>
<author>Joshua Bloch</author>
<year>2018</year>
<publisher>Addison-Wesley</publisher>
</book>
</catalog>
2.2. Ejemplo examen: Consultas XPath para un catálogo de componentes de hardware
Dado el documento XML, escribe consultas XPath para recuperar la siguiente información:
- ¿Cómo seleccionarías los modelos <model> de elementos con una marca que no sea «ASUS»?
- ¿Cómo seleccionarías los modelos <model> de procesadores (elementos de tipo «Processor»)?
- ¿Cómo seleccionarías las especificaciones de elementos con una marca igual a «NVIDIA»?
- ¿Cómo seleccionarías las especificaciones de elementos con un modelo igual a «Core i7-9700K»?
- ¿Cómo seleccionarías las especificaciones de elementos con un tipo igual a «Motherboard»?
- ¿Cuál es la expresión XPath correcta para seleccionar las marcas de elementos cuyas especificaciones no contengan «7200 RPM»?
- ¿Cuál es la expresión XPath correcta para seleccionar las marcas de elementos con un tipo que no sea «RAM»?
- ¿Cuál es la expresión XPath correcta para seleccionar los tipos de elementos con un modelo que comienza con «WD»?
<?xml version="1.0" encoding="UTF-8"?>
<hardwareCatalog>
<item>
<id>1</id>
<type>Processor</type>
<brand>Intel</brand>
<model>Core i7-9700K</model>
<specifications>8-Core, 3.6 GHz</specifications>
</item>
<item>
<id>2</id>
<type>RAM</type>
<brand>Corsair</brand>
<model>Vengeance LPX 16GB</model>
<specifications>DDR4, 3200MHz</specifications>
</item>
<item>
<id>3</id>
<type>Graphics Card</type>
<brand>NVIDIA</brand>
<model>GeForce RTX 3080</model>
<specifications>10GB GDDR6X</specifications>
</item>
<item>
<id>4</id>
<type>Hard Drive</type>
<brand>Western Digital</brand>
<model>WD Blue 1TB</model>
<specifications>SATA, 7200 RPM</specifications>
</item>
<item>
<id>5</id>
<type>Motherboard</type>
<brand>ASUS</brand>
<model>ROG Strix Z390-E</model>
<specifications>Socket LGA1151, ATX</specifications>
</item>
</hardwareCatalog>
2.3. Ejemplo examen: Consultas XPath para un catálogo de software de ordenador con espacios de nombres
Dado el documento XML, escribe consultas XPath para recuperar la siguiente información:
- Seleccionar los nombres <name> de todo el software de OS.
- Seleccionar los nombres <name> del software de oficina desarrollado por Microsoft con una versión etiquetada como «Latest».
- Seleccionar los nombres <name> del software de OS con un número de versión menor que 21.
- Seleccionar los nombres del software desarrollado por Microsoft.
- Seleccionar las URLs <url> de todo el software de oficina.
- Seleccionar la versión de Microsoft Office 365.
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns:os="http://example.com/os" xmlns:office="http://example.com/office">
<os:software>
<name>Linux Mint</name>
<version>20.2</version>
<developer>Linux Mint Community</developer>
<url>https://linuxmint.com</url>
</os:software>
<os:software>
<name>Ubuntu</name>
<version>21.04</version>
<developer>Canonical Ltd.</developer>
<url>https://ubuntu.com</url>
</os:software>
<os:software>
<name>Windows 10</name>
<version>21H1</version>
<developer>Microsoft</developer>
<url>https://microsoft.com/windows</url>
</os:software>
<office:software>
<name>Microsoft Office 365</name>
<version>Latest</version>
<developer>Microsoft</developer>
<url>https://office.com</url>
</office:software>
<office:software>
<name>LibreOffice</name>
<version>7.1</version>
<developer>The Document Foundation</developer>
<url>https://www.libreoffice.org</url>
</office:software>
<office:software>
<name>Google Docs</name>
<version>Web</version>
<developer>Google LLC</developer>
<url>https://docs.google.com</url>
</office:software>
</catalog>
2.4. Ejemplo examen: Consultas XPath para un catálogo de juegos de mesa
Dado el documento XML, escribe consultas XPath para recuperar la siguiente información:
- ¿Cuál es la expresión XPath para seleccionar el juego <boardgame> con id=5?
- ¿Cómo expresarías en XPath para seleccionar los nombres de juegos <name> que tienen expansiones?
- ¿Cuál es la expresión XPath para seleccionar los nombres de juegos <boardgame> con una calificación igual o mayor a 9?
- ¿Qué expresión XPath seleccionaría todos los juegos <boardgame> publicados por «Days of Wonder»?
- ¿Cómo seleccionarías todos los juegos <boardgame> con la categoría «Strategy» usando XPath?
<?xml version="1.0" encoding="UTF-8"?>
<boardgames>
<boardgame id="1">
<name>Ticket to Ride</name>
<rating>9</rating>
<players>2-5</players>
<age>8+</age>
<publisher>Days of Wonder</publisher>
<mechanism>Route Building</mechanism>
<expansion>
<name>Ticket to Ride: Europe</name>
<rating>8</rating>
</expansion>
</boardgame>
<boardgame id="2">
<name>Catan</name>
<rating>8</rating>
<players>3-4</players>
<age>10+</age>
<publisher>Catan Studio</publisher>
<mechanism>Resource Management</mechanism>
</boardgame>
<boardgame id="3">
<name>Pandemic</name>
<rating>9</rating>
<players>2-4</players>
<age>10+</age>
<publisher>Z-Man Games</publisher>
<mechanism>Cooperative</mechanism>
<expansion>
<name>Pandemic: On the Brink</name>
<rating>8</rating>
</expansion>
</boardgame>
<boardgame id="4">
<name>Codenames</name>
<rating>8</rating>
<players>4-8</players>
<age>14+</age>
<publisher>Czech Games Edition</publisher>
<mechanism>Word Game</mechanism>
</boardgame>
<boardgame id="5">
<name>Scythe</name>
<rating>9</rating>
<players>1-7</players>
<age>14+</age>
<publisher>Stonemaier Games</publisher>
<mechanism>Strategy</mechanism>
</boardgame>
</boardgames>
Esperamos que estos ejercicios XPath te hayan sido de utilidad para fortalecer tus habilidades en XPath y XML. ¡Continúa practicando y explorando nuevas oportunidades para seguir mejorando en tu dominio de los Lenguajes de Marcas y Sistemas de Gestión de la Información con los tutoriales de XSLT o XSD!