php SimpleXMLElement奇怪的行为

时间:2014-09-01 10:50:23

标签: php simplexml

我正在使用一种工具将数据从数据库导出到XML文件。我正在编写一个可以获取XML文件,执行各种过滤器,验证等的对象,并将其导入第二个数据库。

我有一个数组,其中包含XML字段名称作为键,数据库表字段名称作为值。

我的一个方法循环遍历每个记录,然后循环遍历字段名称转换数组并构建一个数组以在CodeIgniter insert_batch语句中使用。

我有一个奇怪的问题,我之前没有遇到过,关于动态访问SimpleXMLElement对象的属性。

这是我目前的代码:

    $sql = array();
    foreach($this->current_file as $c => $record){
        $sql[$c] = array();

        foreach($this->schema['tables'][$this->current_file_name]['pairing'] as $sql_field => $xml_field){
            $sql[$c][$sql_field] = $record->$xml_field;
        }
    }

在上面代码块的第5行,您可以看到我查看所有字段名称转换,并将值插入$ sql数组。

XML field (echo $xml_field):                  external_id
SQL field (echo $sql_field):                  global_user_id
External ID (echo $record->external_id):      0717d6d0-3ffb-427d-8870-890132191e7b
Dynamic XML field (echo $record->$xml_field): 

Dump of $record:
    object(SimpleXMLElement)[29]
      public 'external_id' => string '0717d6d0-3ffb-427d-8870-890132191e7b' (length=36)
      public 'teacher' => string 'T' (length=1)
      public 'username' => string 'jdoe' (length=9)
      public 'ChosenName' => string 'John' (length=8)
      public 'Surname' => string 'Doe' (length=8)
      public 'Title' => string 'mr' (length=2)
      public 'Gender' => string 'male' (length=4)

Dump of $record->$xml_field ($record->external_id):
    object(SimpleXMLElement)[30]

如您所见,如果$xml_field值为external_id,请执行以下操作:

echo $record->external_id;

成功输出外部ID。但是,如果我这样做:

$xml_field = 'external_id';
echo $record->$xml_field;

它产生一个空字符串。事实上,$record->xml_field返回一个SimpleXMLElement对象。

我的问题

为什么在动态引用属性时返回SimpleXMLElement对象的实例而不是属性值?当属性被硬编码时,它可以正常工作。

如果您需要任何额外信息,请告诉我们。

由于

修改 调用$record->$xml_element后,SimpleXMLElement对象的内容是:

$xml_element = 'external_id';
var_dump($record->$xml_element);

// Outputs:
[external_id] => SimpleXMLElement Object
    (
        [0] => 0717d6d0-3ffb-427d-8870-890132191e7b
    )

我尝试过$record->$xml_element[0]$record->{$xml_element}[0],但都没有按预期工作。

就好像引用SimpleXMLElement的属性一样会生成一个新的SimpleXMLElement

1 个答案:

答案 0 :(得分:0)

我认为这与你如何填写" $ xml_field"有时你应该在尝试从xml对象获取数据时使用类型转换。

喜欢$x = (string)$xml->blablaField;

否则它可能会返回对象。看起来你的$ xml_field不是你的情况下的字符串。这就是你从" $ record-> $ xml_element"

获得对象的原因