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.