php SimpleXMLElement异常行为

php SimpleXMLElement异常行为,php,simplexml,Php,Simplexml,我正在使用一个工具将数据从数据库导出到XML文件。我正在编写一个对象,它可以获取XML文件,对其执行各种过滤、验证等,并将其导入第二个数据库 我有一个数组,其中包含XML字段名作为键,数据库表字段名作为值 我的一个方法循环遍历每个记录,然后循环遍历字段名转换数组,并构建一个数组以用于CodeIgniter insert_批处理语句 关于从SimpleXMLElement对象动态访问属性,我遇到了一个以前从未遇到过的奇怪问题 这是我当前的代码: $sql = array(); fo

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

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

我的一个方法循环遍历每个记录,然后循环遍历字段名转换数组,并构建一个数组以用于CodeIgniter insert_批处理语句

关于从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_字段值是external_id,如果我执行以下操作:

echo $record->external_id;
它成功输出外部ID。但是,如果我这样做:

$xml_field = 'external_id';
echo $record->$xml_field;
它生成一个空字符串。实际上,$record->xml\u字段返回一个SimpleXMLElement对象

我的问题

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

如果你需要任何额外的信息,请告诉我

谢谢

编辑 调用$record->$xml\u元素后,SimpleXMLElement对象的内容如下:

我尝试过做$record->$xml_元素[0]和$record->{$xml_元素}[0],但都没有达到预期效果


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

我认为这与如何填充$xml_字段有关有时在尝试从xml对象获取数据时应该使用类型转换

比如$x=string$xml->blafield


否则它可能返回对象。在您的案例中,$xml_字段似乎不是字符串。这就是为什么您从$record->$xml_元素中获取对象的原因,以及新SimpleXMLElement的内容是什么?@ClémentMalet感谢您的回答,我已经用结果更新了底部的问题。我不知道这种行为,您可以尝试以下操作:回显字符串$record->$xml_字段?这似乎奏效了,虽然我以为我以前试过,但很明显我在这条路上的某个地方犯了一个错误!不过感谢您的回复:我以为我以前尝试过对字符串进行打字,但没有成功,我只是再次尝试,成功了!非常奇怪,它如何要求对动态属性进行类型转换,而不是对静态值进行类型转换;你也可以试着用它们代替打字。
$xml_element = 'external_id';
var_dump($record->$xml_element);

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