SimpleXML Nesne PHP, json_encode, json_decode

3 Cevap php

Benim uygulamada bir işlev aşağıdakileri yapar:

  • Snoopy kullanarak yakalama Web Sayfası
  • DOMDocument yükleyin sonuç
  • Basit XML Nesne içine DOMDocument yükleyin
  • Gerekli belge bölümünü izole etmek için XPath çalıştırın
  • sonucu json_encode ve daha sonra kullanılmak üzere veritabanına kaydetmek.

Veritabanından bu blok kurtarma ve çözerken benim sorun ortaya çıkar. Ben nesneyi var_dump zaman @ niteliklerini görebilirsiniz, ama benim onlara erişmenizi sağlayan komutların bir arada bulamıyorum.

Hata mesajı: Fatal error: dizi olarak tip stdClass nesnesini kullanamazsınız

Aşağıda benim nesnenin bir örneğkimlikir. Ben çalışmak için kullanılan başka hangi arasında, denedim.

echo $obj['class'];

stdClass Object
(
    [@attributes] => stdClass Object
        (
            [class] => race_kimlikx_hdr
        )

    [img] => stdClass Object
        (
            [@attributes] => stdClass Object
                (
                    [src] => /Images/Icons/i_blue_bullet.gif
                    [alt] => image
                    [title] => United Kingdom
                )

        )

    [a] => Fast Cards
)

3 Cevap

Eğer veritabanından json decode zaman, türünde bir nesne olsun 'stdClass' yerine orijinal türü 'SimpleXMLElement' SimpleXMLElement :: xpath işlevi tarafından geri dönmüş.

StdClass nesne özelliklerini erişen izin SimpleXMLElement nesneler tarafından kullanılan sözde dizisi sözdizimi hakkında 'bilmek' değil.

Normalde bir veritabanında nesneleri depolamak için serialize () ve unserialize () fonksiyonlarını yerine json_encode / decode kullanmak istiyorsunuz, ama ne yazık ki, SimpleXMLElement olanlar ile çalışmıyor.

Bir alternatif olarak, neden sadece gerçek xml saklamaz ve veritabanından getiriliyor sonra SimpleXMLElement geri okuyun:

// convert SimpleXMLElement back to plain xml string
$xml = $simpleXML->asXML();

// ... code to store $xml in the database
// ... code to retrieve $xml from database

// recreate SimpleXMLELement
$simpleXML = simplexml_load_string($xml);

Ben aslında gerçekten hata atılır nerede yapılacak ve çalışıyoruz anlamıyorum, ama kullanabilirsiniz siz nesnenin özelliklerine erişmek için

echo $obj->{'@attributes'}->class; // prints "race_idx_hdr"
echo $obj->img->{'@attributes'}->src; // prints "/Images/Icons/i_blue_bullet.gif"
echo $obj->img->{'@attributes'}->alt; // prints "image"
echo $obj->img->{'@attributes'}->title; // prints "United Kingdom"
echo $obj->a; // prints "Fast Cards"

@ sembolü PHP ayrılmıştır ve tanımlayıcılar için kullanıldığında edilemez, çünkü bu garip sözdizimi ($obj->{'@attributes'}) gereklidir.

Bir nesne bir dizi dönüştürülür ise, sonuç olan elemanları nesnenin özellikleri olduğu bir dizidir.

$asArray = (array)$myObj;
echo $asArray['@attribute'];