La función simplexml_load_file() de PHP nos permite convertir un fichero XML en un Objeto.
Está función está disponible desde la versión PHP 5 y se le pueden pasar 5 parámetros:
- El nombre del fichero XML.
- El nombre de la clase del nuevo objeto (opcional)
- Un conjunto de opciones, los cuales son definidos en la librería libxml2
- Un prefijo del espacio de nombres o URI. (opcional)
- is_prefix es un valor booleano que indica si ns es un prefijo o una URI (opcional)
Para poder entender el uso de la función simplexml_load_file() vamos a crear un cuestionario de preguntas, por lo que seguiremos unos sencillos pasos.
- Para empezar creamos un fichero XML que contiene el cuestionario de preguntas y con cada pregunta una numeración, título y una serie de opciones.
- A continuación crearemos un fichero PHP, para convertir el fichero XML en un objeto usando la función simplexml_load_file()
- Con una sencillo bucle vamos recorriendo el objeto y así se irá creando dinámicamente el formulario de radio buttons.
Empecemos con el fichero XML de preguntas que llamaremos questions.xml
- Cada pregunta contendrá un identificador o numeración de pregunta, un título y sus opciones.
- Crearemos tantas preguntas como deseemos.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?xml version="1.0" encoding="UTF-8"?> <questions>     <question>         <id>1</id>         <title>Entiendo mejor algo</title>         <options>             <option>                 <value>A</value>                 <title>si lo practico.</title>                                 </option>             <option>                 <value>B</value>                 <title>si pienso en ello.</title>             </option>         </options>     </question>     <question>         <id>2</id>         <title>Me considero</title>         <options>             <option>                 <value>A</value>                 <title>realista.</title>                                 </option>             <option>                 <value>B</value>                 <title>innovador.</title>             </option>         </options>     </question>     <question>         <id>3</id>         <title>Cuando pienso acerca de lo que hice ayer, es más probable que lo haga sobre la base de</title>         <options>             <option>                 <value>A</value>                 <title>una imagen.</title>                                 </option>             <option>                 <value>B</value>                 <title>palabras.</title>             </option>         </options>     </question> </questions> | 
El siguiente paso es crear un fichero PHP, en el que utilizaremos la función simplexml_load_file() para convertir el fichero XML en un objeto y así poder recorrerlo fácilmente.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <div id="alertas" class="alert"></div> <form method="post" action="" name="test" id="test" onsubmit="enviar(this); return false;">     <?php      $xml_file = "questions.xml";     if (file_exists($xml_file)) {                         $xmldata = simplexml_load_file("questions.xml") or die("No se pudo cargar el fichero de preguntas.");                       $i=0;                          foreach ($xmldata as $question) {              $numero = $question->{id};               $q = $question->{title}; ?>              <div class="row">                  <div class="col-12 col-md-1 preguntaN"><?php echo $numero; ?></div>                  <div class="col-12 col-md-11 pregunta">                  <p><strong><?php echo $q; ?></strong></p><?php                  foreach ($xmldata->question[$i]->options->option as $option) { ?>                                          <div class="radio">                      <label>                      <input type="radio" id="<?php echo $numero; ?>" name="<?php echo $numero; ?>" value="<?php echo $option->{value}; ?>" /> <?php echo $option->{title}; ?>                      </label>                      </div><?php                                           } ?></div>              </div><?php              $i++;          }     } else { ?>El fichero de preguntas no existe. <?php } ?> </form> <a href="" onclick="enviar(this); return false;" id="enviar">Enviar</a> | 
El siguiente paso sería incluir al funcionario la funcionalidad para poder validarlo y enviarlo usando AJAX y devolver los resultados de la operación en formato JSON.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | function enviar() {     var alertasElement = document.getElementById("alertas");     // vamos a validar los radio buttons y que sea obligatorio cheaquearlos     for (i=1; i<=3; i++) {                 question = document.getElementsByName(i); // group button         if (!(question[0].checked || question[1].checked)) {             debugElement.style.display = "block";             debugElement.classList.add("alert-danger");             alertasElement.innerHTML = "Todos las preguntas deben ser respondidas <strong>(revisa la pregunta "+i+"</strong>)";              return false;         }            } // fin validación      // XHR object     var xhr = new XMLHttpRequest();     xhr.onload = function(res) {                 if (xhr.status == 200) {             // la respuesta con los datos JSON             var res = JSON.parse(this.response);             // hacer lo que queramos conlos datos que devuelve la respuesta             console.log(this.response);                     }     }     // preapare request     var formMethod = "POST";     var formUrl = 'php/test.php';     var formType = true;        xhr.open(formMethod, formUrl, formType);     // prepare form data     var formElement = document.getElementById("test");     var data = new FormData(formElement);     xhr.send(data); } | 
Podeís ver un ejemplo de cómo funcionaría un cuestionario de preguntas sobre un test de aprendizaje (Felder y Silverman) haciendo click aquí
 
            
 
                                     
                                     
                                    