2010-06-04 15 views
11

मैंने सीरियलाइज्ड एसपीएल ऑब्जेक्ट्स से निपटने के लिए कुछ creative solutions देखा है लेकिन अधिक विकल्प (या विस्तार) की तलाश में हूं। मैं नेस्टेड धारावाहिक वस्तुओं को स्टोर करता हूं - जिनमें से एक, SimpleXML है - डेटाबेस में, केवल बाद में अन-धारावाहिक होने के लिए। यह स्पष्ट रूप से कुछ समस्याएं पैदा करता है।एक सरल एक्सएमएल ऑब्जेक्ट को सीरियलाइज़/अनियमित कैसे करें?

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

क्या किसी को धारावाहिक एसपीएल वस्तुओं से निपटने के लिए अत्यधिक विश्वसनीय तरीकों में कोई अंतर्दृष्टि है? __sleep()/__ wakeup() ओवरराइड? कास्ट करने वाली stdClass? कास्ट-टू-स्ट्रिंग, फिर serialize?

किसी भी मदद की सराहना की जाती है।

[ संपादित करें: इन एक्सएमएल स्कीमा का दायरा और भिन्नता ओआरएम के साथ मानचित्र के लिए बहुत भिन्न है। वे अपने सबसे मौलिक स्तर पर, राज्यव्यापी प्रक्रियाओं में मनमाने ढंग से पेलोड हैं, जो शेष एपीआई के भीतर ट्रिगर किए गए हैं।]

उत्तर

29

औचित्य के होते हुए भी पर सवाल, आप इसे वापस एक्सएमएल में इस तरह कर सकते हैं:

$xml = $simpleXmlElem->asXML(); 

और तब, जब आप डेटाबेस से खींच:

$simpleXmlElem = simplexml_load_string($xml); 

चाहे का सवाल है एक्सएमएल के बड़े हिस्से को क्रमबद्ध करना उचित है, यह सच हो सकता है कि डेटाबेस में एक्सएमएल डालने से एक रिलेशनल सिस्टम का उपयोग करने का अधिक फायदा होता है, लेकिन आपके पास सक्षम होने का लाभ होता है एक मनमानी वर्कलोड समायोजित करने के लिए। यदि कुछ फ़ील्ड सार्वभौमिक हैं, और/या आपको उन्हें सामान्यीकृत करने से लाभ प्राप्त होता है (उदा। आप उन क्षेत्रों के आधार पर चयन करना चाहते हैं), उन्हें सामान्यीकृत कॉलम में ले जाएं।

+3

मेरे दिमाग में बड़ा सवाल यह है कि PHP स्वचालित रूप से ऐसा क्यों नहीं करता है? PHP में xml ऑब्जेक्ट्स को क्रमबद्ध/deserializing में कोई गंभीर जुर्माना है? – devios1

1

एक्सएमएल संरचना का प्रतिनिधित्व करने वाले किसी भी ऑब्जेक्ट को क्रमबद्ध करने के लिए एक्सएमएल को बस प्रतिपादन और भंडारण करना सबसे अच्छा तरीका नहीं है?

आप धारावाहिक डेटा के साथ क्या करने का प्रयास कर रहे हैं जो इसे रोक सकता है?

संपादित करें:

इसके अलावा,

मैं नेस्टेड धारावाहिक वस्तुओं [...] डेटाबेस में, केवल अन-धारावाहिक बाद में

तुम क्यों कर रहे हैं होने के लिए की दुकान डेटाबेस में PHP serialized डेटा भंडारण? डेटाबेस में वस्तुओं को स्टोर करने के कई बेहतर तरीके हैं।

+1

बुला "क्यों आप एक डेटाबेस में पीएचपी धारावाहिक डेटा भंडारण कर रहे हैं?" बल्कि बड़ी गतिशील प्रक्रियाओं की स्थिति को संग्रहित करने के लिए। "एक्सएमएल संरचना का प्रतिनिधित्व करने वाली किसी ऑब्जेक्ट को क्रमबद्ध करने का सबसे अच्छा तरीका एक्सएमएल को प्रतिपादन और भंडारण नहीं करना चाहिए?" संभवतः। यही सवाल मैंने देखा था। – allnightgrocery

+0

"वस्तुओं को स्टोर करने के कई बेहतर तरीके हैं।" क्या आप इस बिंदु पर विस्तार से देखभाल करना चाहते हैं? – allnightgrocery

+1

निश्चित रूप से। किसी ऑब्जेक्ट में प्रत्येक प्रॉपर्टी को किसी तालिका में कॉलम पर मैप करने का प्रयास करें।यदि संपत्ति स्वयं एक वस्तु है, तो उस ऑब्जेक्ट को किसी अन्य तालिका में संग्रहीत करने की आवश्यकता है, और किसी विदेशी कुंजी का उपयोग करके माता-पिता में संदर्भित किया जा सकता है। इसे सामान्यतः "ऑब्जेक्ट-रिलेशनल मैपिंग" कहा जाता है, और यह जटिल हो सकता है। यदि आप एक कुंजी-मूल्य या दस्तावेज़ डेटाबेस का उपयोग कर रहे हैं, तो चीजें अलग-अलग हैं ... – Charles

2

अधिक स्पष्ट और ओओपी।

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

} 

और

$xml = new \MyApp\SimpleXMLElement('<resultado/>'); 
    echo $xml->arrayToXml($app->getReturnedValue())->asXML(); 
संबंधित मुद्दे