2009-01-06 6 views
66

की परवाह किए बिना मान लीजिए कि मैं इसएक स्ट्रिंग के लिए एक SimpleXML वस्तु जबरदस्ती, संदर्भ

<channel> 
    <item> 
    <title>This is title 1</title> 
    </item> 
</channel> 

नीचे कोड की तरह कुछ एक्सएमएल करते हैं कि मैं क्या चाहता हूँ कि यह एक स्ट्रिंग

$xml = simplexml_load_string($xmlstring); 
echo $xml->channel->item->title; 
के रूप में शीर्षक आउटपुट करता है

यहां मेरी समस्या है। नीचे दिया गया कोड उस संदर्भ में एक स्ट्रिंग के रूप में शीर्षक का इलाज नहीं करता है, इसलिए मैं एक स्ट्रिंग के बजाय सरणी में SimpleXML ऑब्जेक्ट के साथ समाप्त होता हूं।

$foo = array($xml->channel->item->title); 

मैं इस

$foo = array(sprintf("%s",$xml->channel->item->title)); 

है जैसे कि यह चारों ओर काम कर रहा है लेकिन यह है कि बदसूरत लगता है।

संदर्भ के बावजूद एक SimpleXML ऑब्जेक्ट को स्ट्रिंग पर बल देने का सबसे अच्छा तरीका क्या है?

+0

मैं PHP के लिए एक से अधिक अनुरोध सबमिट करने के बाद इस बात के लिए SOAP_SINGLE_ELEMENT_ARRAYS को कुछ इसी तरह लागू करने के लिए, और दूसरों को भी ऐसा ही करने के लिए प्रोत्साहित करेगा। SOAP_SINGLE_ELEMENT_ARRAYS उन तत्वों को मजबूर करता है जो एक से अधिक स्ट्रिंग को हमेशा स्ट्रिंग के रूप में पार्स किए जा सकते हैं। बेशक अन्य लोगों ने बताया कि आपको यह जानने की जरूरत है कि आप क्या प्राप्त कर रहे हैं, लेकिन समय और समय फिर से मैंने .NET SOAP सर्वर के साथ समस्याओं में भाग लिया है जो डब्लूएसडीएल के लिए (.NET के "जादू" डिफ़ॉल्ट द्वारा) प्रत्येक स्ट्रिंग को प्रोटोटाइप करता है मिश्रित या तारों की एक सरणी। वर्तमान() 'आईएनजी या टाइपकास्टिंग के बजाए, बिट सिर्फ एक स्ट्रिंग – conrad10781

उत्तर

134

Typecast एक स्ट्रिंग के लिए SimpleXMLObject:

$foo = array((string) $xml->channel->item->title); 

ऊपर कोड आंतरिक SimpleXMLObject पर __toString() कहता है। यह विधि सार्वजनिक रूप से उपलब्ध नहीं है, क्योंकि यह SimpleXMLObject की मैपिंग योजना में हस्तक्षेप करती है, लेकिन इसे अभी भी उपरोक्त तरीके से लागू किया जा सकता है।

+0

देता है जो स्प्रिंटफ का उपयोग करने से क्लीनर है। मुझे यह पसंद है –

+5

ध्यान दें कि स्ट्रिंग तर्क स्वीकार करने वाले फ़ंक्शन का उपयोग स्वचालित रूप से इस प्रकार कास्टिंग (उदा। Echo, str_replace, substr) करेगा। – Ross

+0

धन्यवाद अरोन, मैंने सोचा कि एक टाइपकास्ट ऐसा करने का तरीका था लेकिन यह सही महसूस नहीं कर रहा था। अब मुझे पता है कि _toString विधि निजी है, यह समझ में आता है। –

15

आप PHP समारोह

strval(); 

यह फ़ंक्शन पैरामीटर इसे करने के लिए पारित कर दिया की स्ट्रिंग मान का उपयोग कर सकते हैं।

// this gets all the outer levels into an associative php array 
$header = array(); 
foreach($xml->children() as $child) 
{ 
    $header[$child->getName()] = sprintf("%s", $child); 
} 
echo "<pre>\n"; 
print_r($header); 
echo "</pre>"; 

एक बच्चे बच्चे को प्राप्त करने के लिए तो बस ऐसा करते हैं::

+1

में (स्ट्रिंग) काम कर रहा है दुर्भाग्य से strval() सरणी या वस्तुओं पर काम नहीं करता है। –

+3

@ मार्क बीएके: यह उन वस्तुओं पर काम करता है जिनके पास '__toString() 'लागू किया गया है और विशेष रूप से इस प्रश्न में विशिष्ट मामले में, यह' SimpleXMLElement' प्रकार की वस्तुओं के साथ बहुत अच्छी तरह से काम करता है। आप स्वीकृत उत्तर में 'स्ट्रिंग' कास्ट के साथ इसकी तुलना कर सकते हैं। 'strval()' एक आसान कॉलबैक फ़ंक्शन अक्सर ['array_map()'] (http://php.net/array_map) और ['iterator_to_array ($ simpleXMLElement, false) 'के साथ संयोजन में है (http: // php .NET/iterator_to_array) या 'SimpleXMLElement :: xpath() '। – hakre

2

एक php सरणी आप यह कर में XML डेटा प्राप्त करने के लिए

$data = array(); 
foreach($xml->data->children() as $child) 
{ 
    $header[$child->getName()] = sprintf("%s", $child); 
} 
echo "<pre>\n"; 
print_r($data); 
echo "</pre>"; 

आप प्रत्येक स्तर के माध्यम से $ XML-> विस्तार कर सकते हैं जब तक आप प्राप्त नहीं करते हैं, तब तक आप सभी नोड्स को बिना किसी अन्य तरीके के स्तर या के बिना एक सरणी में डाल सकते हैं।

3

एक और बदसूरत तरह से यह करने के लिए:

$foo = array($xml->channel->item->title.""); 

यह काम करता है, लेकिन यह काफी नहीं है।

$xml = new SimpleXMLElement($string); 
$validfilename = '/temp/mylist.xml'; 
$xml->asXML($validfilename); // to a file 
echo $xml->asXML();    // to a string 
9

यह SimpleXMLElement लिखते हैं या सिर्फ एक स्ट्रिंग के लिए 1.0 फ़ाइल XML के मूल निवासी SimpleXML विधि SimpleXMLElement::asXML पैरामीटर के आधार पर नहीं है क्या ओपी अनुरोध किया (एक स्ट्रिंग)। कि जवाब है, उपयोग पर विस्तार करने के लिए:

$foo = [ (string) $xml->channel->item->title ][0]; 

कौन सा सरणी, एक स्ट्रिंग के एक तत्व देता है।

1

स्वीकार किए जाते हैं जवाब वास्तव में एक स्ट्रिंग है, जो वास्तव में नहीं है जिसमें एक सरणी देता है:

1

कोशिश strval ($ XML-> चैनल> आइटम,> शीर्षक)

0

निम्नलिखित एक पुनरावर्ती समारोह है कि एक String करने के लिए सभी एकल बच्चे तत्वों टाइपकास्ट देगा:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// FUNCTION - CLEAN SIMPLE XML OBJECT 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
function cleanSimpleXML($xmlObject = ''){ 

    // LOOP CHILDREN 
    foreach ($xmlObject->children() as $child) { 

     // IF CONTAINS MULTIPLE CHILDREN 
     if(count($child->children()) > 1){ 

      // RECURSE 
      $child = cleanSimpleXML($child); 

     }else{ 

      // CAST 
      $child = (string)$child; 

     } 

    } 

    // RETURN CLEAN OBJECT 
    return $xmlObject; 

} // END FUNCTION 
0
नहीं

यकीन अगर वे __toString() विधि की दृश्यता बदलने के बाद से स्वीकार किए जाते हैं जवाब लिखा गया था लेकिन इस समय यह मेरे लिए ठीक काम करता है:

var_dump($xml->channel->item->title->__toString()); 

उत्पादन:

string(15) "This is title 1" 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^