FANDOM


XML de ejemplo Editar

El siguiente documento XML contiene detalles sobre el reparto de Blade Runner:

<?xml version="1.0"?>
<reparto>
  <papel protagonista="si">
    <personaje>Rick Deckard</personaje>
    <actor>Harrison Ford</actor>
  </papel>
  <papel protagonista="no">
    <personaje>Roy Batty</personaje>
    <actor>Rutger Hauer</actor>
  </papel>
  <papel protagonista="no">
    <personaje>Rachael</personaje>
    <actor>Sean Young</actor>
  </papel>
</reparto>

MySQL y XML desde la línea de órdenes Editar

Así puede conectar con el servidor MySQL desde la línea de órdenes de forma que el resultado de las consultas esté en formato XML:

mysql -u root -p --xml

Puede comprobarlo con la siguiente consulta:

USE videoteca;
 
SELECT * FROM soporte;

O con ésta:

USE videoteca;
 
SELECT nombre FROM soporte;

O con ésta otra consulta:

USE videoteca;
 
SELECT nombre AS soporte FROM soporte;

La siguiente orden le permitirá guardar en formato XML, en un archivo de texto llamado soportes.xml, el resultado de una consulta SQL:

mysql -u root -p --xml -e "SELECT * FROM soporte" videoteca > soportes.xml

Funciones XML en MySQL Editar

MySQL proporciona dos funciones para trabajar con documentos XML: ExtractValue y UpdateXML. Para jugar con estas funciones utilizaremos la tabla pelicula, que se creaba así:

CREATE TABLE pelicula (
  id INT NOT NULL AUTO_INCREMENT,
  titulo VARCHAR(64) NOT NULL,
  idsoporte INT NOT NULL,
  idgenero INT NOT NULL,
  PRIMARY KEY(id),
  INDEX p_FK1(idsoporte),
  INDEX p_FK2(idgenero),
  FOREIGN KEY(idsoporte)
    REFERENCES soporte(id),
  FOREIGN KEY(idgenero)
    REFERENCES genero(id)
) ENGINE = InnoDB;

Vamos a modificarla, añadiendo un campo más:

USE videoteca;
 
ALTER TABLE
  pelicula
ADD
  reparto TEXT NOT NULL;

Ahora, modifiquemos la entrada perteneciente a 'Blade Runner':

USE videoteca;
 
UPDATE
  pelicula
SET
  reparto =
   '<reparto>
      <papel protagonista="si">
        <personaje>Rick Deckard</personaje>
        <actor>Harrisond Ford</actor>
      </papel>
      <papel protagonista="no">
        <personaje>Roy Batty</personaje>
        <actor>Rutger Hauer</actor>
      </papel>
      <papel protagonista="no">
        <personaje>Rachael</personaje>
        <actor>Sean Young</actor>
      </papel>
    </reparto>'
WHERE
  id = 1;

ExtractValue Editar

Un ejemplo de funcionamiento de la función ExtractValue:

SELECT ExtractValue(
 '<papel>
    <personaje>Roy Batty</personaje>
    <actor>Rutger Hauer</actor>
  </papel>',
  '/papel/personaje'
) AS personaje;

Otro ejemplo más:

USE videoteca;
 
SELECT
  ExtractValue(
    reparto,
    '/reparto/papel/personaje'
  ) AS personajes
FROM
  pelicula
WHERE
  id = 1;

Un procedimiento almacenado para extraer datos de un documento XML:

DELIMITER //
 
DROP PROCEDURE IF EXISTS pa_personajes_obtener;
CREATE PROCEDURE pa_personajes_obtener (
  idpelicula INT
)
BEGIN
 
DECLARE i INT DEFAULT 1;
DECLARE j INT DEFAULT 0;
 
DECLARE personajes TEXT DEFAULT '';
DECLARE personaje TEXT DEFAULT '';
 
SELECT
  ExtractValue(reparto, 'count(/reparto/papel)')
INTO
  j
FROM
  pelicula
WHERE
  id = idpelicula;
 
WHILE i <= j DO
 
  SELECT
    ExtractValue(
      reparto,
      '/reparto/papel[$i]/personaje')
  INTO
    personaje
  FROM
    pelicula
  WHERE
    id = idpelicula;
 
  SELECT
    IF(
      i <> j,
      CONCAT(personaje, ', '),
      personaje)
  INTO personaje;
 
  SET personajes = CONCAT(personajes, personaje);
 
  SET i = i + 1;
 
  END WHILE;  
 
  SELECT personajes;
 
END //
 
DELIMITER ;

Es posible utilizar este procedimiento almacenado así:

USE videoteca;
 
CALL pa_personajes_obtener(1);

UpdateXML Editar

Corrección del error del apartado anterior:

USE videoteca;
 
UPDATE
  pelicula
SET
  reparto = UpdateXML(
    reparto,
    '/reparto/papel[1]/actor',
    '<actor>Harrison Ford</actor>'
  )
WHERE
  id = 1;

Comprobemos si el cambio ha tenido éxito:

USE videoteca;
 
SELECT
  ExtractValue(
    reparto,
    '/reparto/papel[1]/actor'
  ) AS actor
FROM
  pelicula
WHERE
  id = 1;

SimpleXML Editar

Recordemos cómo guardar en un archivo de texto, en formato XML, el resultado de una consulta SQL:

mysql -u root -p --xml -e "SELECT * FROM soporte" videoteca > soportes.xml

El contenido de este archivo será algo parecido a esto:

<?xml version="1.0"?>
 
<resultset statement="SELECT * FROM soporte
" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
    <field name="id">1</field>
    <field name="nombre">DVD</field>
    <field name="descripcion">Digital Versatile Disc</field>
  </row>
 
  <row>
    <field name="id">2</field>
    <field name="nombre">VHS</field>
    <field name="descripcion">Video Home Sys-tem</field>
  </row>
</resultset>

Carga Editar

El siguiente código PHP permite cargar un documento XML:

<?php
 
$xml = new SimpleXMLElement(
  'C:\soportes.xml', NULL, TRUE
);
 
echo $xml->asXML();
 
?>

Recorrido de nodos Editar

<?php
 
$xml = new SimpleXMLElement(
  'C:\soportes.xml', NULL, TRUE
);
 
$rows = $xml->xpath('/resultset/row');
 
foreach($rows as $row){
  echo $row->asXML() . '<br/>';
}
 
?>

Acceso a atributos Editar

<?php
 
$xml = new SimpleXMLElement(
  'C:\soportes.xml', NULL, TRUE
);
 
$rows = $xml->xpath('/resultset/row');
 
foreach($rows as $row){
 
  $fields = $row->xpath('field');
 
  foreach($fields as $field){
 
    $attributes = $field->attributes();
 
    foreach($attributes as $attribute){
 
      switch($attribute){
 
        case 'id':
          echo('(' . $field->asXML() . ') ');
          break;
 
        case 'nombre':
          echo('<b>' . $field->asXML() . '</b>: ');
          break;
 
        case 'descripcion':
          echo($field->asXML() . '.<br/>');
          break;
 
      }
 
    }
 
  }
 
}
 
?>
El contenido de la comunidad está disponible bajo CC-BY-SA a menos que se indique lo contrario.