Nasıl Yapılır / unserialize Bir SimpleXMLElement nesnesi dizgeleştirir?

3 Cevap php

Birkaç creative solutions tefrika SPL nesneler ile uğraşan, ancak daha fazla seçenek (veya elaborations) arıyorum için gördüm. Iç içe tefrika nesneleri depolamak -, bunlardan biri olan SimpleXML - veritabanında, ancak daha sonra un-tefrika olmak. Bu tabii ki, bazı sorunlara neden olabilir.

$s = new SimpleXmlElement('<foo>bar</foo>');
$ss = serialize($s);
$su = unserialize($ss);
// Warning: unserialize() [function.unserialize]: Node no longer exists...

Herkes tefrika SPL nesneler ile başa çıkmak için son derece güvenilir yöntemlerden herhangi bir fikir var mı? _ sleep()/ _wakeup () geçersiz kılar? Cast-to-stdClass? Cast-to-dize, daha sonra seri?

Herhangi bir yardım takdir edilmektedir.

[Edit: kapsamı ve bu XML şemaları varyasyon bir ORM ile eşleştirmek için çok çeşitlidir. Onlar huzurlu API'ler içinde tetiklenen onların en temel düzeyde, durumsal süreçlerinde keyfi yükleri, en vardır.]

3 Cevap

Uygunluğu dikkate alınmaksızın ilgili sorular, bu gibi XML geri açabilirsiniz:

$xml = $simpleXmlElem->asXML();

Ve sonra, veritabanından çekin:

$simpleXmlElem = simplexml_load_string($xml);

Sadece XML büyük boyutta getirilmeye uygun olsun gelince, bu veritabanına XML koyarak bir ilişkisel sistemi kullanarak avantajı çok kaldırır, ancak keyfi bir iş yükünü karşılamak mümkün olmanın avantajı var bu doğru olabilir. Bazı alanlar evrenseldir, ve / veya (örneğin, bu alanlara göre seçmek istiyorum) bunları düzgün normalleştirilmesi yarar elde ederse, normalize sütunlar halinde bu hareket.

Sadece render ve XML XML yapısını temsil eden herhangi bir nesne seri hale getirmek için en iyi yolu saklamak değil misiniz?

Ne bu engelleyebilir seri hale getirilmiş verileri ile yapmaya çalışıyorsun?

edit:

Ayrıca,

Ben sadece daha sonra un-tefrika olarak, veritabanında iç içe tefrika nesneleri [...] saklamak

Neden bir veritabanında PHP tefrika veri depolamak? Bir veritabanındaki nesneleri depolamak için çok daha iyi yollar vardır.

Daha net ve OOP.

namespace MyApp;
class SimpleXMLElement extends \SimpleXMLElement
{
    public function arrayToXml($array = array())
    {
        array_walk_recursive($array, array(&$this, 'addChildInverted'));
        return $this;
    }

    public function addChildInverted($name ,$value)
    {
        parent::addChild($value,$name);
    }

}

ve çağrı

  $xml = new \MyApp\SimpleXMLElement('<resultado/>');
  echo $xml->arrayToXml($app->getReturnedValue())->asXML();