2011-12-19 14 views
7

मुझे जावास्क्रिप्ट में इसके साथ काम करने के लिए JSON ऑब्जेक्ट के रूप में परिवर्तित एक SimpleXML ऑब्जेक्ट को वापस करने की आवश्यकता है। समस्या यह है कि किसी वस्तु पर किसी भी वस्तु पर कोई विशेषता नहीं है।PHP SimpleXML ऑब्जेक्ट में गायब विशेषताएँ?

एक उदाहरण के रूप:

<customer editable="true" maxChars="9" valueType="numeric">69236</customer> 

SimpleXML वस्तु में हो जाता है:

"customer":"69236" 

कहाँ @attributes वस्तु है?

उत्तर

-1

यहां कुछ कोड हैं जो विशेषताओं के माध्यम से पुनरावृत्त करने के लिए हैं, और जेएसओएन का निर्माण करते हैं। यदि एक या कई ग्राहकों का समर्थन करता है।

एक्सएमएल यदि आप इस तरह के माध्यम से यह इस (या सिर्फ एक ग्राहक) की तरह

<xml> 
<customer editable="true" maxChars="9" valueType="numeric">69236</customer> 
<customer editable="true" maxChars="9" valueType="numeric">12345</customer> 
<customer editable="true" maxChars="9" valueType="numeric">67890</customer> 
</xml> 

दोहराएं लग रहा है।

try { 
    $xml = simplexml_load_file("customer.xml"); 

    // Find the customer 
    $result = $xml->xpath('/xml/customer'); 

    $bFirstElement = true; 
    echo  "var customers = {\r\n"; 
    while(list(, $node) = each($result)) { 
     if($bFirstElement) { 
      echo "'". $node."':{\r\n"; 
      $bFirstElement = false; 
     } else { 
      echo ",\r\n'". $node."':{\r\n"; 
     } 

     $bFirstAtt = true; 
     foreach($node->attributes() as $a => $b) { 
      if($bFirstAtt) { 
       echo "\t".$a.":'".$b."'"; 
       $bFirstAtt = false; 
      } else { 
       echo ",\r\n\t".$a.":'".$b."'"; 
      } 
     } 
     echo "}"; 
    } 
    echo "\r\n};\r\n"; 
} catch(Exception $e) { 
    echo "Exception on line ".$e->getLine()." of file ".$e->getFile()." : ".$e->getMessage()."<br/>"; 
} 

अपनी स्क्रिप्ट में अंत में इस

var customers = { 
'69236':{ 
    editable:'true', 
    maxChars:'9', 
    valueType:'numeric'}, 
'12345':{ 
    editable:'true', 
    maxChars:'9', 
    valueType:'numeric'}, 
'67890':{ 
    editable:'true', 
    maxChars:'9', 
    valueType:'numeric'} 
}; 

की तरह एक JSON संरचना का निर्माण करने के लिए, इस

WScript.Echo(customers["12345"].editable); 

गुड लक की तरह विशेषता का उपयोग

7

यह मुझे पागल संचालित है कई अवसरों पर। जब SimpleXML एक नोड का सामना करता है जिसमें केवल टेक्स्ट मान होता है, तो यह सभी विशेषताओं को छोड़ देता है। SimpleXML के साथ पार्सिंग से पहले एक्सएमएल को संशोधित करना मेरा कामकाज है। नियमित अभिव्यक्तियों के साथ, आप एक बच्चे नोड बना सकते हैं जिसमें वास्तविक टेक्स्ट मान होता है। यह सोचते हैं कि आपके XML स्ट्रिंग $ str में था

<customer editable="true" maxChars="9" valueType="numeric"><value>69236<value></customer> 

कुछ उदाहरण कोड: उदाहरण के लिए, अपनी स्थिति में आप के लिए एक्सएमएल बदल सकते हैं

$str = preg_replace('/<customer ([^>]*)>([^<>]*)<\/customer>/i', '<customer $1><value>$2</value></customer>', $str); 
$xml = @simplexml_load_string($str); 

कि गुण और घोंसला पाठ मान की रक्षा करेगा एक बच्चे नोड में।

+1

यह विफल रहता है, अगर वहाँ तत्व में एक CDATA खंड है उदाहरण के लिए, तो जैसे: <स्तंभ नाम = "रंग"> –

+0

मेरे लिए, एक्सएमएल ऑब्जेक्ट को लूप करते समय समाधान को स्पष्ट रूप से '-> बच्चों()' को कॉल करना था। अगर मैंने नहीं किया, तो गुण समाप्त हो गए थे। –

3

मुझे एहसास है कि यह एक पुरानी पोस्ट है, लेकिन यदि यह उपयोगी साबित होता है। नीचे हार्ड-कोड किए गए टैग की बजाय किसी भी टैग पर काम करने के लिए @ ryanmcdonnell का समाधान बढ़ाता है। उम्मीद है कि यह किसी की मदद करता है।

$str = preg_replace('/<([^ ]+) ([^>]*)>([^<>]*)<\/\\1>/i', '<$1 $2><value>$3</value></$1>', $result); 

मुख्य अलग है कि यह /<([^ ]+) साथ /<customer बदल देता है, और उसके बाद </customer> साथ </\\1>

जो यह बताता है पैटर्न में पहला तत्व के खिलाफ खोज का वह हिस्सा मैच के लिए है।

फिर यह प्लेसहोल्डर ($1, $2, $3) को इस तथ्य के लिए समायोजित करने के लिए समायोजित करता है कि दो के बजाय अब तीन उप-मैचों हैं।

+1

यह भी विफल रहता है यदि उदाहरण के लिए तत्व में एक सीडीएटीए ब्लॉक है, जैसे: <कॉलम नाम = "रंग">

0

यह एक पुराना सवाल है, लेकिन मुझे कुछ ऐसा लगता है जो इसे डीओएमएनओडी ऑब्जेक्ट में साफ करता है।

// $customer contains the SimpleXMLElement 
$customerDom = dom_import_simplexml($customer); 
var_dump($customerDom->getAttribute('numeric')); 

दिखाई देंगे:

string 'numeric' 
संबंधित मुद्दे