MySQL LOAD XML INFILE的问题

Lek*_*eke 4 xml mysql cdata load-data-infile

我有一个XML文档,格式为...

<?xml version="1.0" encoding="UTF-8"?>
<yahootable>
    <row>
        <various><![CDATA[ multiline 
        text, "&" 
        other <stuff> ]]>
        </various>
        <id>1</id>
        <message><![CDATA[
                sdfgsdfg
                dsfsdfsd ]]>
        </message>
    </row>
<yahootable>
Run Code Online (Sandbox Code Playgroud)

...并且想要使用MySQL的LOAD XML LOCAL INFILE将其插入具有列的表中;(各种,ID,消息)。我似乎无法从未解析的CDATA标记中获取任何数据到数据库列中。是CDATA标记之间的数据被完全忽略,还是我错过了某些事情?我期望CDATA会转义非法的XML字符并将其作为常规文本插入。

谢谢。

Dun*_*ock 5

我找不到LOAD XML INFILE保留CDATA内容的方法。但是,下面的工作和使用好老LOAD DATA INFILE一起ExtractValue()完成同样的事情:

如果我们有您的示例文件和此表:

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

然后运行此语句会将文件内容导入表中:

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')
;
Run Code Online (Sandbox Code Playgroud)

这通过告诉LOAD DATA INFILE每个<row>...</row>都是逻辑“行”来工作,并将其存储在局部变量中@tmp。然后,将作为XML片段传递给ExtractValue函数,并使用适当的XPath表达式从中选择所需的值。