Nie mogłem znaleźć sposobu, aby to zrobić za pomocą LOAD XML INFILE
zachowując zawartość CDATA. Jednak poniższy kod działa i używa starego dobrego LOAD DATA INFILE
wraz z ExtractValue()
osiągnąć to samo:
Jeśli mamy twój przykładowy plik i tę tabelę:
CREATE TABLE `yahootable` (
`id` int(11) NOT NULL PRIMARY KEY,
`various` text,
`message` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;
wtedy uruchomienie tej instrukcji spowoduje zaimportowanie zawartości pliku do tabeli:
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')
;
Działa to poprzez poinformowanie LOAD DATA INFILE, że każdy <row>...</row>
jest logiczną „linią”, którą przechowuje w lokalnej zmiennej @tmp
. Następnie przekazujemy to do ExtractValue
funkcjonować jako fragment XML i wybrać z niego wartości, które chcemy, używając odpowiednich wyrażeń XPath.