如果xsi:nil = true(XML),如何返回NULL

时间:2017-09-08 15:35:49

标签: php mysql xml parsing

解析XML文件时遇到问题。我希望在xsi:nil = true时在我的SQL表中返回NULL。这是XML文件的一个示例:

<row>
  <data>blablabla</data>
</row>
<row>
  <date xsi:nil="true" />
</row>

部分date为空,应该在我的PHP foreach循环中返回NULL。但我认为它们会返回" ",因为我的SQL循环无法读取数据。

这是我的PHP代码示例:

foreach ($xml->xpath('//row') as $row) {
  $date= $row->xpath('./date');
  $item['date'] = $date[0];
  echo $item['date'].'<br/>';

 // insert the result in my SQL database //
 $sql = $sq_connexion->prepare("INSERT INTO my_table (date) VALUES (:date)");
 $sql->execute(array('date' => $item['date']));

}

我想在我的SQL数据库中显示第一个blablabla的值date和显示NULL时的值xsi:nil="true"。目前,有了这种代码,我有这样的错误信息:

 PDOException: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: '' for column 'date' at row 1

1 个答案:

答案 0 :(得分:1)

测试属性的问题是您需要获取特定命名空间的属性。因此,具有该属性的测试看起来略有不同。我添加了一些测试数据,但无法使用数据库位进行测试,所以希望这可以工作......

<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );

$data = "<set xmlns:xsi='http://someurl.com'>
<row>
  <date>0000-00-00</date>
</row>
<row>
  <date xsi:nil=\"true\" />
</row>
</set>";

$xml = new SimpleXMLElement($data);
foreach ($xml->xpath('//row') as $row) {
    $date = $row->date;
    if ( isset( $date->attributes('xsi', true)->nil ))   {
        $date = null;
    }

    // insert the result in my SQL database //
    $sql = $sq_connexion->prepare("INSERT INTO my_table (date) VALUES (:date)");
    $sql->execute(array('date' => $date));
}