微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL LOAD XML 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>

…并希望使用MysqL的LOAD XML LOCAL INFILE将其插入带有列的表中; (各种,身份,消息).我似乎无法将未解析的CDATA标记中的任何数据存入数据库列. CDATA标签间的数据是完全被忽略的,还是我错过了什么?我期待CDATA只是逃避非法的XML字符并将其作为常规文本插入.

谢谢.

解决方法:

在保留CDATA内容的同时,我无法使用LOAD XML INFILE找到这样做的方法.但是,以下工作并使用良好的旧LOAD 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表达式从中选择我们想要的值.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。