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表达式从中选择我们想要的值.
标签:mysql,xml,cdata,load-data-infile 来源: https://codeday.me/bug/20190625/1287729.html