【问题标题】:Why this "extractvalue" returns null为什么这个“提取值”返回 null
【发布时间】:2019-12-26 05:08:37
【问题描述】:

我需要直接从 xml 文件中提取值,精确到一个字段,但我总是得到 NULL 值。

将文件导入表没有问题。该文件位于 c:\xampp\mysql\data\test_folder\test_file.xml。

我用这种方式导入:

LOAD XML INFILE 'test_file.xml'
INTO TABLE tbl_tutorials
CHARACTER SET utf8
ROWS IDENTIFIED BY '<row>'
;

我已经用这种方式创建了表格

    CREATE TABLE IF NOT EXISTS tbl_tutorials(
    item_id INT(11) NOT NULL,
    title VARCHAR(100) NOT NULL,
    link VARCHAR(120) NOT NULL,
    description VARCHAR(400) NOT NULL,
    keywords VARCHAR (50) NOT NULL
) ;

我的 test_file.xml 是这个

<?xml version="1.0" encoding="UTF-8"?>
<tbl_tutorials>
<row>
    <item_id>1</item_id>
    <title>test title 1</title>
    <link>test link 1</link>
    <description>test description 1</description>
    <keywords>test keyword  1</keywords>
</row>
<row>
    <item_id>2</item_id>
    <title>test title 2</title>
    <link>test link 2</link>
    <description>test description 2</description>
    <keywords>test keyword 2</keywords>
</row>
<row>
    <item_id>3</item_id>
    <title>test title 3</title>
    <link>test link 3</link>
    <description>test description 3</description>
    <keywords>test keyword 3</keywords>
</row>

</tbl_tutorials>

我要做的是创建一个包含所有 xml 代码的“var”(不知道这是否是准确的术语),然后从该 var 中提取所需的值。

这样……

SET @xmlFile = load_file('c:\xampp\mysql\data\test_folder\test_file.xml ');
SELECT extractvalue(@xmlFile , '/tbl_tutorials/row/keywords') keywords;

我得到的是

------------
| keywords |
------------
|NULL      |
------------

而我需要的是

----------------
| keywords     |
----------------
|test keyword 1|
----------------

我认为我必须准确指定需要哪个子元素,但我不知道为什么总是返回 null。

我正在使用 mySql 工作台和 Xampp

谢谢大家

编辑

我刚刚在文件路径中添加了另一个“\”反斜杠,现在提取值返回“blob”,这样

SET @xmlFile = load_file('c:\\xampp\\mysql\\data\\test_folder\\test_file.xml ');



------------
| keywords |
------------
|BLOB      |
------------

【问题讨论】:

    标签: mysql xml xampp


    【解决方案1】:

    您的 xml 文件无效,它缺少关闭 &lt;/tbl_tutorials&gt;,因此您会得到 null(无论您尝试提取什么)。

    如果您修复它,您的查询将返回每个关键字,但请参阅ExtractValue 的文档:

    如果找到多个匹配项,则将每个匹配元素的第一个子文本节点的内容(按照匹配的顺序)作为一个以空格分隔的字符串返回。

    要获取第一个“行”标签的关键字,您可以使用

    SELECT ExtractValue(@xmlFile , '/tbl_tutorials/row[1]/keywords') keywords
    

    请注意,“行”标签是编号的,而不是关键字。如果你使用例如

    SELECT ExtractValue(@xmlFile , '/tbl_tutorials/row/keywords[1]') keywords
    

    你得到每一行的第一个关键字,在你的情况下是每个关键字;如果您可以使用它,例如每行有几个关键字,那么这会给你第一个(每行)。

    您还可以通过其属性指定行,例如item_id:

    SELECT ExtractValue(@xmlFile , '/tbl_tutorials/row[item_id="1"]/keywords') keywords
    

    要获取关键字标签的总数(将由您的原始查询返回),您可以使用

    SELECT ExtractValue(@xmlFile , 'count(/tbl_tutorials/row/keywords)') cnt 
    

    【讨论】:

    • 感谢您的回答!我将在帖子中进行更正,因为原始文件确实有结束标记。
    【解决方案2】:

    我在这里找到了解决 BLOB 问题和一般问题的方法

    MySQL Workbench shows results as BLOB

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多