2014-09-01 96 views
1

我正在使用一個工具,它將數據從一個數據庫導出到一個XML文件。我正在寫一個對象,它可以接受XML文件,執行各種過濾器,驗證等等,並將它導入第二個數據庫。php SimpleXMLElement奇怪的行爲

我有一個數組,它包含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; 

它會產生一個空字符串。 Infact,$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

+0

那個新的SimpleXMLElement的內容是什麼? – Sugar 2014-09-01 11:00:07

+0

@ClémentMalet感謝您的回覆,我已經在底部更新了我的問題,結果爲 – 2014-09-01 11:07:11

+1

我不知道這種行爲,你可以試試這個:echo(string)$ record - > $ xml_field;'? – Sugar 2014-09-01 11:14:01

回答

0

我認爲這是與你如何填補「$ xml_field」有時候你應該使用類型轉換,當你試圖從XML對象數據有關。

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

,否則它可能會返回對象。看起來像你的$ xml_field不是你的情況下的字符串。那就是爲什麼你從「$ record - > $ xml_element」獲得對象

+0

我以爲我曾嘗試過類型轉換爲字符串,它沒有工作,我只是試了一遍,它的工作成功!非常奇怪,它需要在動態屬性上進行類型轉換,而不是靜態值。 – 2014-09-01 11:23:30

+0

我不太記得,但我認爲有一些SimpleXMLElement的本地方法,如toString();你也可以嘗試它們來代替類型轉換。 – 2014-09-01 11:26:13