1

下午好 !

我在所有网络上进行了研究,但我还没有找到任何关于它的信息。这很奇怪,可能是个人问题。因为任何人都有像我这样的问题。

所以,我在 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。有一些方法可以去除该标签,只返回值?!

4

2 回答 2

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 表达式从中选择我们想要的值并将结果存储在适当的列中。

于 2013-10-10T01:15:15.550 回答
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);

于 2016-07-27T16:52:18.640 回答