Ejercicios: Capítulo 4 Ejercicio 1* Crea un documento XML para guardar los detalles de los alumnos. El elemento raíz debe ser estudiantes, con 4 elementos child (hijo). Cada elemento child (hijo) necesita tener 3 subchilds; studentId (id de estudiante), firstName (nombre) y lastName (apellido). Solución #1 Abre tu editor de texto favorito y añade las siguientes líneas de código en un archivo: <?xml version="1.0" encoding="utf-8" ?> <students> <student> <studentId>7324</studentId> <firstName>John</firstName> <lastName>Smith</lastName> </student> <student> <studentId>5447</studentId> <firstName>Hannah</firstName> <lastName>Young</lastName> </student> <student> <studentId>2285</studentId> <firstName>Sarah</firstName> <lastName>White</lastName> </student> <student> <studentId>5323</studentId> <firstName>Kevin</firstName> <lastName>Adams</lastName> </student> </students> Guarda el archivo como students.xml en tu localización preferida. Abre el archivo en tu browser favorito y el resultado será el siguiente: Puedes añadir la cantidad que quieras de elementos child (hijo) y sub child (hijo). Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 1 Ejercicio 2* Formatea el mismo documento XML que has creado en el Ejercicio #1 utilizando CSS. Los detalles de cada alumno deben ser exhibidos en nuevas líneas. Muestra el ID de Estudiante en rojo con el tamaño fuente 15pt y el nombre y el apellido en azul con el tamaño fuente 25pt. Solución #2 Abre el archivo students.xml en tu editor de texto. Poco después de la primera línea, añade la siguiente línea de código para enlazar a la hoja de estilo: <?xml-stylesheet type="text/css" href="styles.css" ?> Guarda el archivo students.xml. Después abre un nuevo archivo en tu editor de texto y añade las siguientes líneas de código: students { } background-color:white; width:100%; student { } display:block; margin-left: 10pt; margin-top: 10pt; studentId { color:red; font-size:15pt; } firstName, lastName { color:blue; font-size:25pt; } Guarda el archivo como styles.css en la misma pasta donde guardaste el archivo students.xml. Ahora abre el archivo students.xml en tu browser y el resultado será el siguiente: Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 2 Ejercicio 3* Crea un documento XML donde el utilizador es informado, al principio, sobre la estructura del documento XML y después sobre la estructura XML actual. Solución #3 Abre tu editor de texto y añade las siguientes líneas de código en un archivo: <?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="text/css" href="styles.css" ?> <students> <![CDATA[ For your information. Here is the structure of the XML document. <students> is the root element and <student> is the child element. Next, <studentId> specifies the unique Id. <firstName> and <lastName> specifies the first and last name of the student respectively. For example, <studentId>7324</studentId> <firstName>John</firstName> <lastName>Smith</lastName> means that John Smith is a student with student id 7324. ]]> <student> <studentId>7324</studentId> <firstName>John</firstName> <lastName>Smith</lastName> </student> <student> <studentId>5447</studentId> <firstName>Hannah</firstName> <lastName>Young</lastName> </student> <student> <studentId>2285</studentId> <firstName>Sarah</firstName> <lastName>White</lastName> </student> <student> <studentId>5323</studentId> <firstName>Kevin</firstName> <lastName>Adams</lastName> </student> </students> Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 3 Guarda el archivo como cdata.xml en la misma pasta donde guardaste styles.css. Abre el archivo en cualquier browser y el resultado será el siguiente: Ejercicios: Capítulo 4 4 Ejercicio 4* Crea un documento XML que guarde los detalles de varias músicas instrumentales. Los detalles deben incluir title (título), composer (compositor), duration (duración) y link (enlace) para la música. Presenta los datos en una tabla utilizando XSLT para que el utilizador pueda pinchar el enlace directamente y escuchar la música. Solución #4 Abre tu editor de texto y añade las siguientes líneas de código en un archivo: <?xml version="1.0" encoding="ISO-8859-1" ?> <?xml-stylesheet type="text/xsl" href="songs.xsl" ?> <list> <song> <title>Wildflower</title> <composer>Richard Clayderman</composer> <time>2.56</time> <src>http://ia601501.us.archive.org/16/items/Best100InstrumentalSongs/024RichardClayderman-WildFlower.mp3</src> </song> <song> <title>Music Box Dancer</title> <composer>Frank Mills</composer> <time>3.19</time> <src>http://ia601501.us.archive.org/16/items/Best100InstrumentalSongs/062-FrankMillsMusicBoxDancer.mp3</src> </song> <song> <title>Thanksgiving</title> <composer>George Winston</composer> <time>4.07</time> <src>http://ia801501.us.archive.org/16/items/Best100InstrumentalSongs/007-GeorgeWinstonThanksgiving.mp3</src> </song> <song> <title>Dolannes Melody</title> <composer>Jean Claude Borelly</composer> <time>3.28</time> <src>http://ia801501.us.archive.org/16/items/Best100InstrumentalSongs/093JeanClaudeBorelly-DolannesMelody.mp3</src> </song> <song> <title>That Happy Feeling</title> <composer>Bert Kaempfert</composer> <time>2.55</time> <src>http://ia801501.us.archive.org/16/items/Best100InstrumentalSongs/040-BertKaempfertThatHappyFeeling.mp3</src> </song> </list> Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 5 Guarda el archivo como music.xml en tu localización favorita. Abre un nuevo archivo en el editor de texto y añade las siguientes líneas de código: <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Song List</h2> <table border="1"> <tr bgcolor="aqua"> <th>Title</th> <th>Composer</th> <th>Duration</th> <th>Link</th> </tr> <xsl:for-each select="list/song"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="composer"/></td> <td><xsl:value-of select="time"></xsl:value-of></td> <td><a href="{src}"><xsl:value-of select="title"/></a></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Guarda el archivo como songs.xsl en la misma pasta donde guardaste el archivo music.xml. Ahora abre el archivo music.xml en tu browser (el browser necesita ser actualizado). Tu pantalla aparecerá así: Pincha cualquier enlace que quieras oír y escucha la música correspondiente. Necesitas estar conectado/a a Internet si quieres oír la música. Ejercicios: Capítulo 4 6 Ejercicio 5* Crea un documento XML que guarde los detalles de cinco empleados. El elemento raíz necesita ser <employees> y el elemento child (hijo) <employee>. Cada elemento child (hijo) debe tener cuatro elementos: id, name (nombre), department (departamento) y salary (sueldo). Muestra los detalles de todos los empleados en una tabla utilizando los métodos XML DOM Get apropiados. Haz con que los valores de id se pueden pinchar para que cuando los utilizadores pinchen el enlace se abra una nueva página con los detalles particulares del empleado y una caja de texto para actualizar el sueldo. Cuando el utilizador cambia el sueldo y pincha el botón de Save (Gravar), el sueldo debe actualizarse. Solución #5 Crea una pasta llamada exercise5 en la pasta xampp/htdocs. Abre tu editor de texto y añade las siguientes líneas de código en un archivo: <?xml version="1.0" encoding="ISO-8859-1" ?> <employees> <employee> <id>15672</id> <name>John Smith</name> <department>HR</department> <salary>$15000</salary> </employee> <employee> <id>18542</id> <name>Olivia Clark</name> <department>Accounts</department> <salary>$19000</salary> </employee> <employee> <id>26581</id> <name>Sophia Lopez</name> <department>Software</department> <salary>$23000</salary> </employee> <employee> <id>27931</id> <name>Ethan Turner</name> <department>Accounts</department> <salary>$20000</salary> </employee> <employee> <id>27965</id> <name>Noah Nelson</name> <department>Accounts</department> <salary>$20000</salary> </employee> </employees> Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 7 Guarda el archivo como employees.xml en la pasta exercise5. Abre un nuevo archivo en tu editor. Copia las siguientes líneas de código: <html> <head> <title></title> <script type="text/javascript"> function loadXMLDoc(name) { var xhttp; if (window.XMLHttpRequest) xhttp = new XMLHttpRequest(); else xhttp = new ActiveXObject("Microsoft.XMLHTTP"); xhttp.open("GET", name, false); xhttp.send(); return xhttp.responseXML; } var xmlDocument = loadXMLDoc('employees.xml'); var len = xmlDocument.getElementsByTagName("id").length; document.write("<h2>Employee Details</h2>"); var output = "<table border=\"1\"><tr><th>Id</th><th>Name</th><th>Department</th><th>Salary</th></tr>"; for ( i = 0; i < len; i++) { id = xmlDocument.getElementsByTagName("id")[i].childNodes[0].nodeValue output += "<tr><td><a href=\"changeSalary.html?id=" + id + "\">"; output += id; output += "</a></td><td>"; output += xmlDocument.getElementsByTagName("name")[i].childNodes[0].nodeValue; output += "</td><td>"; output += xmlDocument.getElementsByTagName("department")[i].childNodes[0].nodeValue; output += "</td><td>"; output += xmlDocument.getElementsByTagName("salary")[i].childNodes[0].nodeValue; output += "</td></tr>"; } output += "</table>"; document.write(output); </script> </head> <body> <div id="result"></div> </body> </html> Ejercicios: Capítulo 4 8 Guarda el archivo como index.html en la pasta exercise5. Ahora abre el index.html en tu browser colocando localhost/exercise5/index.html. Tu pantalla aparecerá así: <html> <head> <title></title> <script type="text/javascript"> var currentId; var xmlDocument; function load() { xmlDocument = loadXMLDoc('employees.xml'); var len = xmlDocument.getElementsByTagName("id").length; id = window.location.search.slice(4); document.getElementById("empId").innerHTML = id; for ( i = 0; i < len; i++) { if (xmlDocument.getElementsByTagName("id")[i].childNodes[0].nodeValue == id) { currentId = i; name = xmlDocument.getElementsByTagName("name")[i].childNodes[0].nodeValue; document.getElementById("name").innerHTML = name; department = xmlDocument.getElementsByTagName("department")[i].childNodes[0].nodeValue; document.getElementById("dept").innerHTML = department; salary = xmlDocument.getElementsByTagName("salary")[i].childNodes[0].nodeValue; document.getElementById("salary").innerHTML = salary; } } } function saveDetails() { newsal = document.getElementById("newsalary").value; xmlDocument.getElementsByTagName("salary")[currentId].childNodes[0].nodeValue = newsal; alert("Details saved successfully"); } function loadXMLDoc(name) { var xhttp; if (window.XMLHttpRequest) xhttp = new XMLHttpRequest(); else xhttp = new ActiveXObject("Microsoft.XMLHTTP"); xhttp.open("GET", name, false); xhttp.send(); return xhttp.responseXML; } Ejercicios: Capítulo 4 9 function displayDetails() { var output = "<table border=\"1\"><tr><th>Name</th><th>Department</th><th>Salary</th></tr>"; var len = xmlDocument.getElementsByTagName("id").length; for ( i = 0; i < len; i++) { output += "<tr><td>"; output += xmlDocument.getElementsByTagName("name")[i].childNodes[0].nodeValue; output += "</td><td>"; output += xmlDocument.getElementsByTagName("department")[i].childNodes[0].nodeValue; output += "</td><td>"; output += xmlDocument.getElementsByTagName("salary")[i].childNodes[0].nodeValue; output += "</td></tr>"; } output += "</table>"; document.getElementById("result").innerHTML = output; } </script> </head> <body onload="load();"> <h3>Enter the New Salary and Click Save</h3> <table> <tr> <td>Employee Id:</td> <td><div id="empId"></div></td> </tr> <tr> <td>Name:</td> <td><div id="name"></div></td> </tr> <tr> <td>Department:</td> <td><div id="dept"></div></td> </tr> <tr> <td>Current Salary:</td> <td><div id="salary"></div></td> </tr> <tr> <td>New Salary:</td> <td> <input type="text" id="newsalary" /> </td> </tr> <tr> <td> <button id="btnSave" onclick="saveDetails();"> Save </button></td> <td> <button id="btnDisplay" onclick="displayDetails();"> Display Ejercicios: Capítulo 4 10 </tr> </body> </button></td> </table> <div id="result"></div> </html> Guarda el archivo como changeSalary.html en la pasta exercise5. Ahora abre el index.html en tu browser colocando localhost/exercise5/index.html. Tu pantalla aparecerá así: Pincha cualquier de los ids, por ejemplo 18542. Te aparecerá una nueva pantalla como esta: Ahora coloca un nuevo valor en la caja de texto y pincha Save. Verás un nuevo mensaje como este: Ahora pincha OK y después pincha el botón Display. Te aparecerá una pantalla así, donde podrás ver el nuevo sueldo ($22000) de Olivia Clark. Ejercicios: Capítulo 4 11 Ejercicio 6* Crea una aplicación que permita al utilizador añadir y apagar detalles de los empleados en un documento XML. Utiliza el mismo archivo employees.xml que utilizaste en el ejercicio anterior. Añade un botón Add Employee (Añadir Empleado) en la página del index.html. Cuando el utilizador pincha el botón debe ser enviado para una nueva página donde pueda colocar el id, name (nombre), department (departamento) y salary (sueldo) de un empleado y grabar esos datos. Añade un botón Delete (Apagar) a la página changeSalary.html. Cuando el utilizador pincha este botón se deben apagar los datos particulares del empleado. Solución #6 Abre tu editor de texto y el archivo index.html. Añade un botón como este, dentro de la tag <body>: <button id="btnAdd" onclick="addEmployee();">Add Employee</button> Añade las siguientes líneas de código dentro de la tag <script>: function addEmployee() { window.location = "addDetails.html"; } Abre un nuevo archivo en tu editor de texto y añade las siguientes líneas de código: <html> <head> <title>Change Salary</title> <script type="text/javascript"> var xmlDocument; window.onload = function() { xmlDocument = loadXMLDoc('employees.xml'); } function saveDetails() { var rootNode=xmlDocument.documentElement; newNode=xmlDocument.createElement("employee"); newId=xmlDocument.createElement("id"); var id = document.getElementById("empId").value; newIdText=xmlDocument.createTextNode(id); newName=xmlDocument.createElement("name"); var name = document.getElementById("empName").value; newNameText=xmlDocument.createTextNode(name); Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 12 newDept=xmlDocument.createElement("department"); var department = document.getElementById("dept").value; newDeptText=xmlDocument.createTextNode(department); newSalary=xmlDocument.createElement("salary"); var salary = document.getElementById("salary").value; newSalaryText=xmlDocument.createTextNode(salary); newId.appendChild(newIdText); newNode.appendChild(newId); newName.appendChild(newNameText); newNode.appendChild(newName); newDept.appendChild(newDeptText); newNode.appendChild(newDept); newSalary.appendChild(newSalaryText); newNode.appendChild(newSalary); rootNode.appendChild(newNode); alert("Details saved successfully."); } function loadXMLDoc(name) { var xhttp; if(window.XMLHttpRequest) xhttp = new XMLHttpRequest(); else xhttp = new ActiveXObject("Microsoft.XMLHTTP"); xhttp.open("GET", name, false); xhttp.send(); return xhttp.responseXML; } function displayDetails() { var output = "<table border=\"1\"><tr><th>Name</th><th>Department</th><th>Salary</th></tr>"; var len= xmlDocument.getElementsByTagName("id").length; for(i=0;i<len;i++) { output += "<tr><td>"; output += xmlDocument.getElementsByTagName("name")[i].childNodes[0].nodeValue; output += "</td><td>"; output += xmlDocument.getElementsByTagName("department")[i].childNodes[0].nodeValue; output += "</td><td>"; output += xmlDocument.getElementsByTagName("salary")[i].childNodes[0].nodeValue; output += "</td></tr>"; } output += "</table>"; document.getElementById("result").innerHTML = output; } Ejercicios: Capítulo 4 13 </script> </head> <body> <h3>Enter the Details</h3> <table> <tr> <td>Employee Id:</td> <td><input type="text" id="empId" /></td> </tr> <tr> <td>Name:</td> <td><input type="text" id="empName" /></td> </tr> <tr> <td>Department:</td> <td><input type="text" id="dept" /></td> </tr> <tr> <td>Current Salary:</td> <td><input type="text" id="salary" /></td> </tr> <tr> <td><button id="btnSave" onclick="saveDetails();">Save</button></td> <td><button id="btnDisplay" onclick="displayDetails();">Display</button></td> </tr> </table> <div id="result"></div> </body> </html> Guarda el archivo como addDetails.html en la pasta exercise5. Abre el changesalary.html en tu editor de texto y añade las siguientes líneas de código en la sección <body> junto con los botones Save y Display: <td><button id="btnDelete" onclick="deleteDetails();">Delete</button></td> Añade las siguientes líneas de código dentro de la tag <script>: function deleteDetails() { var rootNode=xmlDocument.documentElement; var node = xmlDocument.getElementsByTagName("employee")[currentId]; var name = xmlDocument.getElementsByTagName("name")[currentId].childNodes[0].nodeValue rootNode.removeChild(node); alert("The details of the employee " + name + " has been removed."); } Guarda el archivo changeSalary.html. Abre el archivo index.html en tu browser colocando localhost/exercise5/index.html. Pincha cualquier de los ids de empleado, por ejemplo 26581. Serás enviado para una nueva página como esta: Ejercicios: Capítulo 4 14 Pincha el botón Delete y verás un mensaje como este: Para confirmar que los datos fueron apagados, pincha OK y después el botón Display. Te aparecerá una pantalla como esta y los datos de Sophía Lopez ya no estarán disponibles en la tabla: Ahora vuelve otra vez al archivo index.html (los datos de Sophía Lopez no estarán apagados en la página index.html) y pincha el botón Add Employee. Serás redirigido para una nueva pantalla así. Ejercicios: Capítulo 4 15 Coloca datos válidos en cada caja de texto y pincha Save. Te aparecerá una pantalla como esta: Pincha OK y después el botón Display para confirmar que los datos fueron añadidos. Podrás verificar los datoss que añadiste recientemente a Emma White: No hemos hecho ningún tipo de validación a los inputs. Lo puedes hacer, si quieres que el código sea de mayor confianza. Ejercicios: Capítulo 4 16 Ejercicio 7* Crea una página web que muestre los datoss de todos los empleados en un archivo employees.xml (creado en el ejercicio 5) utilizando la función PHP. Solución #7 Copia el archivo employees.xml de la pasta exercise5 y colócalo dentro de la pasta xampp/htdocs. Abre tu editor de texto y añade las siguientes líneas de código a un nuevo archivo: <?php $x = simplexml_load_file('employees.xml'); $i=1; foreach($x->employee as $employee) { echo "<b>Employee Id:</b> " . $employee->id. "<br />". "<b>Name:</b> " . $employee->name . "<br />". "<b>Department:</b> " . $employee->department . "<br />". "<b>Salary:</b> " . $employee->salary . "<br /><br />"; } ?> Guarda el archivo como xml.php en la pasta xampp/htdocs. Abre el archivo en tu browser web colocando localhost/xml.php. Tu pantalla aparecerá así: Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 17 Ejercicio 8* Crea un feed RSS que busque las noticias tecnológicas más recientes de la BBC News. Solución #8 Abre tu editor de texto y añade las siguientes líneas de código a un nuevo archivo: <?php function getFeed($url) { $x = simplexml_load_file($url); echo "<ul>"; foreach($x->channel->item as $feed) { echo "<li><a href='$feed->link' title='$feed->title'>" . $feed->title . "</a></li>"; } echo "</ul>"; } echo getFeed("http://feeds.bbci.co.uk/news/technology/rss.xml"); ?> Guarda el archivo como rssBBC.php en la pasta xampp/htdocs. Abre el archivo en tu browser web colocando localhost/rssBBC.php. Tu pantalla aparecerá así: Puedes pinchar cualquier de estos enlaces y serás enviado a la página correspondiente de la BBC News. Ejercicios: Capítulo 4 * El código y las imágenes generadas por ese código están en inglés. 18