5

我有一个格式为...的 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>

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

谢谢。

4

1 回答 1

7

LOAD XML INFILE在保留 CDATA 内容的同时,我找不到这样做的方法。但是,以下工作和使用 good oldLOAD DATA INFILE一起ExtractValue()完成同样的事情:

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

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

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

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')
;

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

于 2013-10-10T01:07:25.120 回答