为什么此“提取值”返回null

时间:2019-08-21 00:00:03

标签: mysql xml xampp

我需要直接从一个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|
----------------

我认为我必须确切地指定需要哪个子元素,但是我不知道为什么总会返回空值。

我正在使用mySql工作台和Xampp

谢谢大家

修改

我刚刚在文件路径中添加了反斜杠“ \”,现在extractvalue通过这种方式返回“ blob”

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



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

2 个答案:

答案 0 :(得分:0)

您的xml文件无效,缺少结尾</tbl_tutorials>,因此您得到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 

答案 1 :(得分:0)

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

  

MySQL Workbench shows results as BLOB

谢谢大家。