Mysql
 sql >> Database >  >> RDS >> Mysql

Problemi con MySQL LOAD XML INFILE

Non sono riuscito a trovare un modo per farlo usando LOAD XML INFILE preservando i contenuti CDATA. Tuttavia, quanto segue funziona e utilizza il buon vecchio LOAD DATA INFILE insieme a ExtractValue() per realizzare la stessa cosa:

Se abbiamo il tuo file di esempio e questa tabella:

CREATE TABLE `yahootable` (
  `id` int(11) NOT NULL PRIMARY KEY,
  `various` text,
  `message` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;

quindi l'esecuzione di questa istruzione importerà il contenuto del file nella tabella:

LOAD DATA INFILE 
    '/tmp/yahootable.xml'
INTO TABLE 
    yahootable
CHARACTER SET 'utf8'
LINES STARTING BY '<row>' TERMINATED BY '</row>'
(@tmp)
SET
  id      = ExtractValue(@tmp, '//id'),
  various = ExtractValue(@tmp, '//various'),
  message = ExtractValue(@tmp, '//message')
;

Funziona dicendo LOAD DATA INFILE che ogni <row>...</row> è una 'linea' logica, che memorizza nella variabile locale @tmp . Quindi lo passiamo a ExtractValue funziona come un frammento XML e seleziona da esso i valori che desideriamo utilizzando le espressioni XPath appropriate.