【问题标题】:Problems with MySQL LOAD XML INFILEMySQL LOAD XML INFILE 的问题
【发布时间】:2012-10-17 22:36:07
【问题描述】:

我有一个格式为...的 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 字符并将其作为常规文本插入。

谢谢。

【问题讨论】:

    标签: mysql xml cdata load-data-infile


    【解决方案1】:

    在保留 CDATA 内容的同时,我找不到使用 LOAD XML INFILE 的方法。但是,以下工作并使用旧的 LOAD DATA INFILEExtractValue() 来完成同样的事情:

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

    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 每个&lt;row&gt;...&lt;/row&gt; 是一个逻辑“行”来工作,它存储在局部变量@tmp 中。然后我们将其作为 XML 片段传递给 ExtractValue 函数,并使用适当的 XPath 表达式从中选择我们想要的值。

    【讨论】:

    • 谢谢@Duncan,工作顺利。我所做的唯一修改是为了适应本地系统的文件路径,将“LOAD DATA INFILE”替换为“LOAD DATA LOCAL INFILE”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2013-04-10
    • 2014-02-18
    • 2017-11-04
    • 1970-01-01
    • 2012-10-05
    • 2010-11-17
    相关资源
    最近更新 更多