2012-09-18 17 views
6

मुझे पता है कि यह एक नौसिखिया सवाल हो सकता है, लेकिन कृपया मुझे हास्य दें। टैग में "साबुन:" के साथ एक XML स्ट्रिंग को पढ़ने पर, simplexml_load_string() xml में नहीं पढ़ेगा।simplexml_load_string() टैग्स में "साबुन:" के साथ साबुन प्रतिक्रिया नहीं पढ़ेगी

इस स्क्रिप्ट दी:

#!/usr/bin/php 
<?php 

$s=' 
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
     <soap:Header> 
     <context xmlns="urn:zimbra"/> 
     </soap:Header> 
     <soap:Body> 
      <AuthResponse xmlns="urn:zimbraAdmin"> 
       <authToken>somevalue</authToken> 
       <lifetime>123124123</lifetime> 
       <a n="zimbraIsDomainAdminAccount">false</a> 
      </AuthResponse> 
     </soap:Body> 
    </soap:Envelope>'; 


print_r(simplexml_load_string($s)); 
echo "\n\n"; 
print_r(simplexml_load_string(str_ireplace("soap:", "", $s))); 
?> 

मैं इस उत्पादन प्राप्त करें:

[email protected]ebian:~/code/zmsoap$ ./xmltest.php 
SimpleXMLElement Object 
(
) 

SimpleXMLElement Object 
(
    [Header] => SimpleXMLElement Object 
     (
      [context] => SimpleXMLElement Object 
       (
       ) 

     ) 

    [Body] => SimpleXMLElement Object 
     (
      [AuthResponse] => SimpleXMLElement Object 
       (
        [authToken] => somevalue 
        [lifetime] => 123124123 
        [a] => false 
       ) 

     ) 

) 
[email protected]:~/code/zmsoap$ 

मैं सिर्फ उत्सुक क्यों यह हो रहा है हूँ, और अगर वहाँ के रूप में समस्या का समाधान करने के लिए एक अधिक उचित तरीका है एक स्ट्रिंग प्रतिस्थापित करने का विरोध किया।

+0

नाम स्थान के साथ एक समस्या की तरह लग रहा। – JvdBerg

उत्तर

12

में एक पेट के साथ एक टैग नाम टैग को इंगित करता है एक गैर-डिफ़ॉल्ट नाम स्थान में है। SimpleXML केवल एक समय में एक नेमस्पेस को देखता है, इसलिए आपको विशेष रूप से the ->children() method का उपयोग करके नामस्थान का चयन करना होगा।

इस मामले में $xml->children('http://www.w3.org/2003/05/soap-envelope')->Body या $xml->children('soap', true)->Body दोनों काम करना चाहिए।

इस और अन्य कारणों से, SimpleXML ऑब्जेक्ट्स को डीबग करने के लिए print_r का उपयोग करने की सलाह नहीं दी जाती है। इसके बजाय this dedicated function आज़माएं।

+0

समाधान के लिए धन्यवाद ... लंबी खोज के बाद यह मिला ... – 4naxr

5

ऐसा लगता है कि यह काम किया है।

इसे यहाँ के बारे में पढ़ें: Parse XML with Namespace using SimpleXML

#!/usr/bin/php 
<?php 

$s=' 
    <soap:Envelope xmlns:soap="urn:zimbra"> 
     <soap:Header> 
     <context xmlns="urn:zimbra"/> 
     </soap:Header> 
     <soap:Body> 
      <AuthResponse xmlns="urn:zimbraAdmin"> 
       <authToken>somevalue</authToken> 
       <lifetime>123124123</lifetime> 
       <a n="zimbraIsDomainAdminAccount">false</a> 
      </AuthResponse> 
     </soap:Body> 
    </soap:Envelope>'; 
//print_r(simplexml_load_string($s)); 
//echo "\n\n"; 
//print_r(simplexml_load_string(str_ireplace("soap:", "", $s))); 
$xml = simplexml_load_string($s); 
$xml->registerXPathNamespace("soap", "http://www.w3.org/2003/05/soap-envelope"); 
print_r($xml->xpath('//soap:Body')); 

?> 
+0

आप XPath को छूए बिना ऐसा कर सकते हैं और केवल मुख्य SimpleXML फ़ंक्शंस/ऑपरेटरों का उपयोग कर सकते हैं। मैंने जो जवाब अभी जोड़ा है उसे देखें। – IMSoP

0

सरल:

$xml='<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><AddOrderResult>1</AddOrderResult></soap:Body></soap:Envelope>'; 
var_export(json_decode(json_encode(simplexml_load_string(strtr($xml, array(' xmlns:'=>' ')))), 1)); 

उत्पादन:

array (
    '@attributes' => 
    array (
    'soap' => 'http://schemas.xmlsoap.org/soap/envelope/', 
), 
    'soap:Body' => 
    array (
    'AddOrderResult' => '1', 
), 
) 
+0

मुझे नहीं लगता कि यह *** सरल *** कैसे हो सकता है, 'json_decode (json_encode' कोई समझ नहीं आता है। –