2010-05-24 12 views
6

Mam obiekt simpleXml i chcę odczytać dane z obiektu, jestem nowy w PHP i nie wiem, jak to zrobić. Szczegóły obiektu są następujące.Jak przechodzić przez obiekt SimpleXML w PHP

Muszę przeczytać [opis] i [godziny]. Dziękuję Ci.

SimpleXMLElement Object (
    [@attributes] => Array (
     [type] => array 
    ) 
    [time-entry] => Array (
     [0] => SimpleXMLElement Object (
      [date] => 2010-01-26 
      [description] => TCDM1 data management: sort & upload 
      [hours] => 1.0 
      [id] => 21753865 
      [person-id] => 350501 
      [project-id] => 4287373 
      [todo-item-id] => SimpleXMLElement Object (
       [@attributes] => Array (
        [type] => integer 
        [nil] => true 
       ) 
      ) 
     ) 
     [1] => SimpleXMLElement Object (
      [date] => 2010-01-27 
      [description] => PDCH1: HTML 
      [hours] => 0.25 
      [id] => 21782012 
      [person-id] => 1828493 
      [project-id] => 4249185 
      [todo-item-id] => SimpleXMLElement Object (
       [@attributes] => Array (
        [type] => integer 
        [nil] => true 
       ) 
      ) 
) ) ) 

Proszę mi pomóc. Próbuję dużo rzeczy, ale nie mam odpowiedniej składni.

Odpowiedz

10

To naprawdę trudne do odczytania powyższego, jeśli może dać nam zrzut ekranu lub podać odstępy między wierszami i wcięcia, które mogłyby być nieco lepsze Jeśli mamy obiekt

$ XML, który jest obiektem SimpleXML można uzyskać dostęp do elementów, takich jak

$xml->element. 

wygląda jest elementem wpisu czasu, w którym to przypadku będzie pętli tak:

foreach($xml->{'time-entry'} as $time_entry) { 
    echo $time_entry->description . "<br />\n"; 
} 
+0

Wielkie dzięki, to działało dobrze. Chłopaki, rock, Jeszcze raz dziękuję ... – Aditya

1

Jeśli obiekt, który masz w nazwie print_r, znajduje się w $element, poniższe elementy wykonają pętlę nad dwoma elementami time-entry podczas drukowania ich wartości description i hours.

foreach ($element->{'time-entry'} as $entry) { 
    $description = (string) $entry->description; 
    $hours  = (string) $entry->hours; 
    printf("Description: %s\nHours: %s\n\n", $description, $hours); 
} 

wyjść coś takiego:

Description: TCDM1 data management: sort & upload NFP SubProducers list 
Hours: 1.0 

Description: PDCH1: HTML 
Hours: 0.25 

Zauważ, że nazwa time-entry element ma zostać owinięte w nawiasach klamrowych jako ciąg, ponieważ w przeciwnym razie $element->time-entry staraliby się czytać element time i odjąć wartość stałej o nazwie entry, co oczywiście nie jest tym, czego chcemy. Ponadto wartości description i hours są odlewane od do ciągów (w przeciwnym razie byłyby obiektami typu SimpleXMLElement).

1. Zobacz variable variables 2. Patrz type casting

+0

Wielkie dzięki, to działa dobrze. Chłopaki, rock, dzięki jeszcze raz ... – Aditya

0

Niestety jestem nowy na PHP Właśnie rozpoczął naukę więc moje koncepcje pochodzą z programowania C. Możliwe, że robię tu nadmierną ilość pracy/kodowania ... ale jestem pewna, że ​​ktoś mnie wkurzy i się nauczę.

ta zwraca tablicę z powrotem, który jest ładnie rozplanowany dostępu do wszystkich poszczególnych bitów danych, bez konieczności obsługi obiektów SimpleXMLElement:

public $xmlFileInName = 'sample.xml'; 

public $errorMessage = "Failed to open file: "; 

public function actionGetArray() 
{ 
    try { 
     $xml = file_exists($this->xmlFileInName) ? 
     simplexml_load_file($this->xmlFileInName) : 
     exit($this->errorMessage. $this->xmlFileInName); 

     $xmlArray=$this->arrayFromSxe ($xml); 

     echo var_dump($xmlArray); 
    } 
    catch(Exception $e) { 
     echo $e->getMessage(); 
    } 
} 

public function arrayFromSxe($sxe) 
{ 
    $returnArray = array(); 
    foreach ((array)$sxe as $key=>$value) { 
     if(is_array($value) && !$this->is_assoc($value)) { 
      $indies = array(); 
      foreach($value as $secondkey=>$secondvalue) 
       $indies[$secondkey] = $this->arrayFromSxe($secondvalue); 
      $returnArray[$key] = $indies; 
     } 
     else { 
      if(is_object($value)) { 
       $returnArray[$key] = $this->arrayFromSxe($value); 
      } else { 
       $returnArray[$key] = $value; 
      } 
     } 
    } 
    return $returnArray; 
} 

function is_assoc($array) { 
    return (bool)count(array_filter(array_keys($array), 'is_string')); 
} 

Należy zauważyć, że z wieloma znacznikami XML, czyli w swoim przykładzie:

[time-entry] => Array (
    [0] => SimpleXMLElement Object (
    ... 
    ) 
    [1] => SimpleXMLElement Object (
    ... 
    ) 

Będziesz musiał wiedzieć coś o strukturze pliku XML, aby rozwiązać ten problem w tobie. ten powróci w tablicy po wywołaniu tej linii:

$xmlArray=$this->arrayFromSxe ($xml); 

które będą miały:

[time-entry][0] 
[time-entry][1] 

Więc twój kod będzie trzeba wiedzieć, aby iteracyjne nad wszystkimi czasowe wpisy poprzez int indeksujących lub w jakikolwiek sytuacja, w której są one wielokrotnymi wystąpieniami elementu xml.

Jeśli to, co powiedziałem, nie ma sensu, należy je zignorować i po prostu obserwować i oceniać kod w jego obecnym stanie.

Mam nadzieję, że to pomoże.

Powiązane problemy