导入XML(CDATA)

时间:2013-04-20 18:26:59

标签: mysql xml cdata

下午好!

我在所有网络上进行过研究,但我还没有发现任何相关信息。这很奇怪,也许这是个人问题。因为任何人都有像我这样的问题。

所以,我在mysql中创建了一个简单的命令来完成这项工作

LOAD XML LOCAL INFILE 
    'person.xml'
INTO TABLE 
    person
ROWS IDENTIFIED BY 
    '<person>'

文件person.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<list>
  <person>
      <field name="person_id">5</field>
      <field name="fname"><![CDATA[Ronström]]></field>
      <field name="lname">Ulin</field>
  </person>
  <person>
      <field name="person_id">6</field>
      <field name="fname"><![CDATA[Mikael]]></field>
      <field name="lname">Sköld</field>
  </person>
</list>

INSERT完成没有问题,重点是不插入标签CDATA内的值,它返回NULL。有一些方法可以去除该标记,只返回值?!

2 个答案:

答案 0 :(得分:2)

我无法使用LOAD XML INFILE使其工作 - 它似乎吃了CDATA内容。

我确实使用常规的旧LOAD DATA INFILE让它工作。给出您的示例XML文件和此表:

CREATE TABLE `people` (
  `person_id` int(11) NOT NULL PRIMARY KEY,
  `fname` text,
  `lname` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

运行它会将文件中的数据导入表格中:

LOAD DATA INFILE 
    '/tmp/person.xml'
INTO TABLE 
    people
CHARACTER SET 'utf8'
LINES STARTING BY '<person>' TERMINATED BY '</person>'
(@person)
SET
  person_id = ExtractValue(@person, '//field[@name="person_id"]'),
  fname     = ExtractValue(@person, '//field[@name="fname"]'),
  lname     = ExtractValue(@person, '//field[@name="lname"]')
;

这通过告诉LOAD DATA INFILE每个<person>...</person>是一个逻辑“行”,它存储在局部变量@person中。然后,我们将此作为XML片段传递给ExtractValue()函数,使用适当的XPath表达式从中选择我们想要的值,并将结果存储在相应的列中。

答案 1 :(得分:0)

罗, 这可能与您的问题相关,也可能不相关(您可能已经找到了解决方案),但对于其他任何人:

如果您使用php加载xml文件:

您需要加载设置了LIBXML_NOCDATA标志的xml文件。这将把它拉得恰到好处。

所以如果你以前有过: $xml = simplexml_load_file('some/file/path.xml');

你想要这个:

$xml = simplexml_load_file('some/file/path.xml',null,LIBXML_NOCDATA);