下午好!
我在所有网络上进行过研究,但我还没有发现任何相关信息。这很奇怪,也许这是个人问题。因为任何人都有像我这样的问题。
所以,我在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。有一些方法可以去除该标记,只返回值?!
答案 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);