我正在使用一种工具将数据从数据库导出到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
答案 0 :(得分:0)
我认为这与你如何填写" $ xml_field"有时你应该在尝试从xml对象获取数据时使用类型转换。
喜欢$x = (string)$xml->blablaField;
否则它可能会返回对象。看起来你的$ xml_field不是你的情况下的字符串。这就是你从" $ record-> $ xml_element"
获得对象的原因