2014-09-01 3 views
1

데이터베이스의 데이터를 XML 파일로 내보내는 도구를 사용하고 있습니다. XML 파일을 가져 와서 다양한 필터를 수행하고 유효성 검사 등을 수행 할 수있는 객체를 작성하고 두 번째 데이터베이스로 가져옵니다.php SimpleXMLElement 이상한 행동

XML 필드 이름을 키로, 데이터베이스 테이블 필드 이름을 값으로 포함하는 배열이 있습니다.

내 방법 중 하나는 각 레코드를 반복 한 다음 필드 이름 변환 배열을 반복하고 CodeIgniter insert_batch 문에서 사용할 배열을 작성합니다.

SimpleXMLElement 객체의 속성에 동적으로 액세스하는 것과 관련하여 이전에 경험하지 못한 이상한 문제가 있습니다.

이 내 현재 코드입니다 : 위의 코드 블록에서 5 행에

$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; 
     } 
    } 

, 당신은 내가 모든 필드 이름 변환을 통해 살펴보고,하고 $ SQL 배열에 값을 삽입 할 수 있습니다. 당신이 볼 수 있듯이 $xml_field 값이 external_id 경우 내가 수행하는 경우

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] 

, 다음

echo $record->external_id; 

이 성공적으로 외부 ID를 출력합니다. 그러나 이렇게하면 :

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

빈 문자열이 생성됩니다. 사실, $record->xml_field은 SimpleXMLElement 객체를 반환합니다.

내 질문

내가 동적 속성을 참조 할 때 왜 대신 속성 값의 SimpleXMLElement 객체의 인스턴스를 반환

? 속성이 하드 코드 된 경우 잘 작동합니다.

추가 정보가 필요하면 알려 주시기 바랍니다. 내가 $record->$xml_element[0]$record->{$xml_element}[0] 일을 시도했습니다

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

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

하지만 어느 작업은 예상대로 :

감사

편집 $record->$xml_element를 호출 후 SimpleXMLElement 개체의 내용이 있습니다.

SimpleXMLElement의 속성을 참조하는 새로운 SimpleXMLElement에게

+0

그리고 새 SimpleXMLElement의 내용은 무엇입니까? – Sugar

+0

@ ClémentMalet 답장을 보내 주셔서 감사합니다. 아래쪽에있는 결과를 –

+1

으로 업데이트했습니다.이 동작에 대해 잘 모르겠습니다. 이것을 시도해보십시오 :'echo (string) $ record -> $ xml_field;'? – Sugar

답변

0

를 생성하는 경우 난 그것이 당신이 "$의 xml_field"당신이 XML 객체에서 데이터를 얻으려고 할 때 때로는 타입 캐스팅을 사용해야 채우기 어떻게와 관련이 생각하는 그것입니다. $x = (string)$xml->blablaField;

같은

그렇지 않으면 객체를 반환 할 수 있습니다. $ xml_field가 귀하의 경우 문자열이 아닌 것 같습니다.그 이유는 "$ record -> $ xml_element"에서 객체를 가져 오는 이유입니다.

+0

이전에 문자열에 타입 캐스팅을 시도했지만 작동하지 않았다고 생각했습니다. 다시 시도해 보았지만 성공적으로 처리되었습니다! 매우 이상한데, 어떻게 동적 속성에 대한 타입 캐스팅이 필요하지만 정적 값에는 필요하지 않습니다. –

+0

나는 아주 잘 기억하지 못하지만, toString()과 같은 SimpleXMLElement의 네이티브 메소드가 있다고 생각한다. 당신은 또한 typecasting 대신 그들을 시도 할 수 있습니다. –