2010-09-06 12 views
8

पार्स करते समय cdata सामग्री हो रही है मैं एक xml फ़ाइलxml फ़ाइल

<?xml version="1.0" encoding="utf-8"?> 
<xml> 
    <events date="01-10-2009" color="0x99CC00" selected="true"> 
     <event> 
      <title>You can use HTML and CSS</title> 
      <description><![CDATA[This is the description ]]></description> 
     </event> 
    </events> 
</xml> 

मैं xml पार्स करने के लिए xpath और और XQuery इस्तेमाल किया है।

$xml_str = file_get_contents('xmlfile'); 
$xml = simplexml_load_string($xml_str); 
if(!empty($xml)) 
{ 
    $nodes = $xml->xpath('//xml/events'); 
} 

मैं ठीक से शीर्षक हो रही है, लेकिन iam नहीं मिल रहा description.How मैं अंदर डेटा प्राप्त कर सकते cdata

उत्तर

8

SimpleXML CDATA के साथ एक समस्या का एक सा है, इसलिए का उपयोग करें:

$xml = simplexml_load_file('xmlfile', 'SimpleXMLElement', LIBXML_NOCDATA); 
if(!empty($xml)) 
{ 
    $nodes = $xml->xpath('//xml/events'); 
} 
print_r($nodes); 

यह आपको दे देंगे:

गलत
Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [date] => 01-10-2009 
        [color] => 0x99CC00 
        [selected] => true 
       ) 

      [event] => SimpleXMLElement Object 
       (
        [title] => You can use HTML and CSS 
        [description] => This is the description 
       ) 

     ) 

) 
+0

धन्यवाद slomojo। यह ठीक काम कर रहा है। – Warrior

+4

गलत! SimpleXML को सीडीएटीए के साथ कोई समस्या नहीं है, और यह एक सतत मिथक है जिसे कायम नहीं किया जाना चाहिए। यह केवल 'print_r' है जो सीडीएटीए नहीं देख सकता है, क्योंकि SimpleXML वास्तव में अपने डेटा को" असली "PHP ऑब्जेक्ट के रूप में संग्रहीत नहीं करता है, यह सिर्फ मांग पर खांसी करता है। – IMSoP

9

आप शायद किया जा रहा है यह सोचने में लगा कि सीडीएटीए print_r या अन्य "सामान्य" PHP डीबगिंग फ़ंक्शंस का उपयोग करके गायब है। ये एक SimpleXML ऑब्जेक्ट की पूरी सामग्री नहीं देख सकते हैं, क्योंकि यह "वास्तविक" PHP ऑब्जेक्ट नहीं है।

यदि आप echo $nodes[0]->Description चलाते हैं, तो आप पाएंगे कि आपका सीडीएटीए ठीक हो गया है। क्या हो रहा है कि PHP जानता है कि echo एक स्ट्रिंग की अपेक्षा करता है, इसलिए एक के लिए SimpleXML से पूछता है; SimpleXML सभी सीडीएटीए सहित स्ट्रिंग सामग्री के साथ प्रतिक्रिया करता है।

पूर्ण स्ट्रिंग सामग्री को विश्वसनीय रूप से प्राप्त करने के लिए, बस PHP को बताएं कि आप जो चाहते हैं वह (string) कास्ट ऑपरेटर का उपयोग कर एक स्ट्रिंग है, उदा। $description = (string)$nodes[0]->Description

SimpleXML वस्तुओं डिबग करने के लिए और इस तरह quirks द्वारा मूर्ख नहीं बनाया जा, इनमें से एक के रूप में एक समर्पित डिबगिंग समारोह में इस तरह का उपयोग करें: https://github.com/IMSoP/simplexml_debug

2

यह भी एक और व्यवहार्य विकल्प है, जो कि कोड को हटा दें और जीवन एक होगा हो सकता है थोड़ा आसान

$xml = str_replace("-", "_", $xml); 
$xml = str_replace("<![CDATA[", "", $xml); 
$xml = str_replace("]]>", "", $xml); 
संबंधित मुद्दे