2010-05-24 21 views
6

Bir SimpleXml nesnesine sahibim ve veriyi nesneden okumak istiyorum, PHP için yeni ve bunu nasıl yapacağımı bilmiyorum. Nesne detayları aşağıdaki gibidir.PHP'de bir SimpleXML nesnesinden nasıl geçebilirim?

[description] ve [hours] kodlarını okumam gerekiyor. Teşekkür ederim.

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 
       ) 
      ) 
) ) ) 

Lütfen bana yardım edin. Çok fazla şey deniyorum, ama sözdizimini doğru yapmıyorum.

cevap

10

O bize bir ekran görüntüsü vermek veya satır aralığının ve girintiler verebilir olacağını, yukarıda okumak gerçekten zor biraz daha iyi Bir nesneyi bir SimpleXML nesnesidir

$ xml varsa , sen

$xml->element. 

zaman giriş unsuru gibi görünüyor gibi unsurları erişebileceği böyle döngü yoluyla olur bu durumda:

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

Çok teşekkürler, çok iyi çalıştı. Sizler rock, Bir kez daha teşekkürler ... – Aditya

1

Sorunun içinde print_r belirtilmiş olan nesne $element içeriyorsa, ilgilive hours değerlerini yazdırırken, aşağıdaki iki time-entry öğesinin üzerine dönecektir.

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

Çıkışlar gibi bir şey:

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

Description: PDCH1: HTML 
Hours: 0.25 

time-entry eleman adı aksi $element->time-entrytime elemanı okuyup çıkarmak için çalışacaktı beri bir dize olarak küme parantezleri sarılı gerektiğini Not entry olarak adlandırılan bir sabitin değeri, bizim istediğimiz gibi değil. Ayrıca, description ve hours değerleri, dizelere dökülür (aksi takdirde SimpleXMLElement türünde nesneler olabilir).

1.

variable variables 2. PHP yeni Ben sadece kavramlar C programlama gelen çok öğrenmeye başladı duyuyorum type casting

+0

Çok teşekkürler, çok iyi çalıştı. Siz çocuklar sallayın, bir kez daha teşekkürler .. – Aditya

0

Maalesef bak. Burada aşırı miktarda iş/kodlama yapıyor olabilirim ... ama eminim ki birisi tarafından bağırılıp öğreneceğim. Bu güzel SimpleXMLElement nesnelerini işlemek zorunda kalmadan tüm verileri tek tek bit erişmek için dışarı serildiği geri dizisi döndürür

:

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')); 
} 

Not senin örnekte yani çoklu xml etiketlerle:

Kod içinde bunu ele almak için XML dosyasının yapısı hakkında bir şeyler bilmek zorundasınız.
$xmlArray=$this->arrayFromSxe ($xml); 

olacak Hangi: Bu, bu çizgiyi çağırdıktan sonra bir dizideki dönecektir

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

Yani kod int Dizinleyicilere yoluyla veya herhangi tüm zaman girdileri üzerinde yineleme bilmek gerekir xml elemanının çoklu oluşumları olan durum.

Söylediğim şey bir anlam ifade etmiyorsa, bunu dikkate almayın ve kodu göründüğü gibi gözlemleyin ve değerlendirin.

Bu yardımcı olur umarım.

İlgili konular