PHP: कैसे संभालें <! [CDATA [SimpleXMLElement के साथ?


97

मैंने देखा कि जब SimpleXMLElementउन CDATA टैग वाले दस्तावेज़ पर उपयोग किया जाता है, तो सामग्री हमेशा होती है NULL। मैं यह कैसे तय करुं?

इसके अलावा, यहाँ XML के बारे में स्पैमिंग के लिए खेद है। मैं कई घंटों के लिए काम करने के लिए एक XML आधारित स्क्रिप्ट प्राप्त करने की कोशिश कर रहा हूं ...

<content><![CDATA[Hello, world!]]></content>

मैंने Google पर पहली हिट की कोशिश की अगर आप "SimpleXMLElement cdata" की खोज करते हैं, लेकिन यह काम नहीं किया।


आप नोड मान तक पहुंचने का प्रयास कैसे कर रहे हैं? और, SimpleXML एक आवश्यकता है?
23

मैंने हर दूसरे फंक्शन (xml2array और सभी) को आज़माया, जो मुझे वेब पर मिल सकता है और सिम्पलेक्स X केवल एक ही चीज़ लगती है, जो अच्छे परिणाम देती है, सिवाय CDATA के काम नहीं करने के लिए।
एंजेलो

1
हम DOMDocument ( php.net/manual/en/class.domdocument.php ) का उपयोग करते हुए बहुत से XML पार्सिंग करते हैं । यह CDATA को संभालने में ठीक काम करता है। हमारे लिए यह देखने के लिए कि आप SimpleXML के साथ कैसे काम कर रहे हैं, एक छोटा या अधिक कोड दें।
ऑल

जवाबों:


182

आप शायद इसे सही तरीके से एक्सेस नहीं कर रहे हैं। आप इसे सीधे आउटपुट कर सकते हैं या इसे स्ट्रिंग के रूप में कास्ट कर सकते हैं। (इस उदाहरण में, कास्टिंग शानदार है, क्योंकि प्रतिध्वनि अपने आप इसे वैसे भी करती है)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
);
echo (string) $content;

// or with parent element:

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>'
);
echo (string) $foo->content;

आप के साथ बेहतर भाग्य हो सकता है LIBXML_NOCDATA:

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
    , null
    , LIBXML_NOCDATA
);

2
नहीं, PHP किसी कारण से पूरी तरह से CDATA को छोड़ देता है। कोई अन्य विचार?
एंजेलो

4
फिर यह एक बग है। PHP / libxml को तब तक अपग्रेड करें जब तक यह काम न करे (मुझे CDATA और SimpleXML के साथ कोई समस्या नहीं है।) आप LIBXML_NOCDATA के साथ अपनी किस्मत आज़माना चाहते हैं।
जोश डेविस

5
मुझे पता है कि यह एक पुराना उत्तर है, लेकिन मैं यह कहना चाहूंगा कि इस उत्तर का पहला भाग सही है । जब आप परिणाम को अपने साथ प्रिंट करते print_rहैं तो आप वास्तव में इसे सही तरीके से एक्सेस नहीं कर रहे हैं। वह कोड लिखें जिसे आप वास्तव में चाहते हैं - संभवतः echoएक (string)कलाकार के साथ , या आप पाएंगे कि सामग्री ठीक है। LIBXML_NOCDATA का उपयोग न करें यह अप्रासंगिक है।
IMSoP

7
@IMSoP LIBXML_NOCDATA जोड़ना (और कुछ नहीं बदलना) काम करता है, इसलिए मुझे यकीन नहीं है कि यह अप्रासंगिक है।
रैंड

3
@SimonePalazzo XML में विभिन्न विभिन्न "नोड्स" शामिल हैं - उदाहरण के लिए <anElement>a text node <aChildElement /> <![CDATA a cdata node]]> another text node</anElement>। CDATA और टेक्स्ट नोड अलग-अलग प्रकार के होते हैं, और SimpleXML इसे ट्रैक करता है ताकि आप XML को आपके द्वारा वापस प्राप्त कर सकें। जब आप एक SimpleXML ऑब्जेक्ट को किसी ऐरे में निचोड़ते हैं, तो यह बहुत सारी जानकारी को निकाल देता है - CDATA नोड, टिप्पणियां, कोई भी तत्व नहीं वर्तमान नामस्थान (जैसे <someNSPrefix:someElement />) में, पाठ में बाल तत्व की स्थिति, आदि LIBXML_NOCDATACDATA नोड्स को टेक्स्ट नोड में परिवर्तित करता है, लेकिन बाकी को ठीक नहीं करता है।
IMSoP 15

48

LIBXML_NOCDATAके वैकल्पिक तीसरे पैरामीटर है simplexml_load_file()समारोह। यह XML ऑब्जेक्ट को सभी CDATA डेटा को स्ट्रिंग्स में परिवर्तित करने के साथ लौटाता है।

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);
echo "<pre>";
print_r($xml);
echo "</pre>";


SimpleXML में CDATA को ठीक करें


LIBXML_NOCDATA ने मेरे लिए यह काम किया है। PHP 5.3.5
माइक_के

1
आपका उत्तर वह है जो LIBXML_NOCDATA का अर्थ समझाता है, धन्यवाद!
Marcio Mazzucato

14

इसने मेरे लिए चाल चली:

echo trim($entry->title);

यदि आपको cdata (LIBXML_NOCDATA के बिना) रखने की आवश्यकता है, तो सही है
maztch

10

यह मेरे लिए परफेक्ट काम कर रहा है।

$content = simplexml_load_string(
    $raw_xml
    , null
    , LIBXML_NOCDATA
);

0

कब करें इस्तेमाल LIBXML_NOCDATA?

मैं XML को JSON में कनवर्ट करते समय समस्या को जोड़ता हूं।

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo json_encode($xml, true); 
/* prints
   {
     "content": {}
   }
 */

SimpleXMLElement ऑब्जेक्ट को एक्सेस करते समय, इसे CDATA प्राप्त होता है:

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo $xml->content; 
/* prints
   Hello, world!
*/

मैं उपयोग करने के लिए समझ में आता है LIBXML_NOCDATAक्योंकि json_encodeस्ट्रिंग कास्टिंग सुविधा को ट्रिगर करने के लिए SimpleXMLElement तक पहुंच नहीं है, मैं एक __toString()बराबर अनुमान लगा रहा हूं ।

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>", null, LIBXML_NOCDATA);
echo json_encode($xml);
/*
 {
   "content": "Hello, world!"
 }
*/
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.