我正在使用一个工具,它将数据从数据库导出到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
对象的实例而不是属性值?当属性被硬编码时,它可以很好地工作。
如果你需要任何额外的信息,请告诉我。
谢谢
编辑SimpleXMLElement对象的内容,调用$record->$xml_element
后如下所示:
$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
发布于 2014-09-01 03:19:17
我认为这与如何填充"$xml_field“有关,有时,当您试图从xml对象获取数据时,应该使用类型转换。
就像$x = (string)$xml->blablaField;
否则,它可能返回对象。在您的情况下,您的$xml_field似乎不是一个字符串。这就是为什么从"$record->$xml_element“中获得对象的原因。
https://stackoverflow.com/questions/25604174
复制相似问题