পিএইচপি: কীভাবে <! [সিডিএটিএ [সিম্পলএক্সএমলেমেন্ট সহ) হ্যান্ডেল করবেন?


100

আমি লক্ষ্য করেছি যে SimpleXMLElementসেই দস্তাবেজগুলিতে যখন সেই সিডিএটিএ ট্যাগগুলি ব্যবহার করা হয় তখন সামগ্রীটি সর্বদা থাকে NULL। আমি কিভাবে এটা ঠিক করব?

এছাড়াও, এক্সএমএল সম্পর্কে স্প্যামিং করার জন্য দুঃখিত। আমি বেশ কয়েক ঘন্টা ধরে এক্সএমএল ভিত্তিক স্ক্রিপ্টটি কাজ করার চেষ্টা করছি ...

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

আপনি "সিম্পল এক্সএমলেমেন্ট সিডিটা" অনুসন্ধান করলে আমি গুগলে প্রথম হিট চেষ্টা করেছি, কিন্তু এটি কার্যকর হয়নি।


আপনি কীভাবে নোড মানটি অ্যাক্সেস করার চেষ্টা করছেন? এবং, সিম্পলএক্সএমএল একটি প্রয়োজনীয়?
অলাইটনাইটগ্রোসারি

আমি ওয়েবে এবং সিম্পলএক্সএমএল-তে পাওয়া যে সমস্ত অন্যান্য ক্রিয়াকলাপ (xML2array এবং সমস্ত) চেষ্টা করেছিলাম কেবলমাত্র সিডিএটিএ কাজ না করে কেবল ভাল ফলাফল দেয় বলে মনে হয়।
অ্যাঞ্জেলো

4
আমরা DOMDocament ( php.net/manual/en/class.domdocament.php ) ব্যবহার করে কাজে প্রচুর এক্সএমএল পার্সিং করি । এটি সিডিএটিএ পরিচালনা করতে ঠিক কাজ করে। আপনি কীভাবে সিম্পল এক্সএমএল নিয়ে কাজ করছেন তা দেখার জন্য আমাদের একটি সংক্ষিপ্ত বিবরণ দিন বা আরও একটি কোড দিন।
অলাইটনাইটগ্রোসারি

উত্তর:


184

আপনি সম্ভবত এটি সঠিকভাবে অ্যাক্সেস করছেন না। আপনি এটিকে সরাসরি আউটপুট করতে পারেন বা স্ট্রিং হিসাবে কাস্ট করতে পারেন। (এই উদাহরণে, castালাই অতিমাত্রায় হয়, যেমন প্রতিধ্বনির ফলে এটি স্বয়ংক্রিয়ভাবে হয়)

$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
);

4
না, পিএইচপি কোনও কারণে সিডিএটা সম্পূর্ণভাবে এড়িয়ে যায় ips অন্য কোন ধারণা?
অ্যাঞ্জেলো

4
তারপরে এটি একটি বাগ। এটি কাজ না করা অবধি পিএইচপি / লিবক্সএমএল আপগ্রেড করুন (সিডিটিএ এবং সিম্পল এক্সএমএল নিয়ে আমার কোনও সমস্যা হয়নি।) অন্যথায় আপনি নিজের ভাগ্য চেষ্টা করতে চাইতে পারেন।
জোশ ডেভিস

4
আমি জানি এটি একটি পুরানো উত্তর, তবে আমি জোর দিয়ে বলতে চাই যে এই উত্তরের প্রথম অংশটি সঠিক । আপনি যখন ফলাফলটি মুদ্রণ করবেন তখন print_rসত্যিকার অর্থে এটি সঠিকভাবে অ্যাক্সেস করছেন না। আপনি যে কোডটি চান তা লিখুন - সম্ভবত echoবা একটি (string)কাস্ট সহ, এবং আপনি সামগ্রীটি ভাল দেখতে পাবেন। LIBXML_NOCData ব্যবহার করবেন না এটি অপ্রাসঙ্গিক।
আইএমএসওপি

7
@ আইএমএসওপি এলআইবিএক্সএমএল_নোকডাটা যুক্ত করা (এবং অন্য কিছুই পরিবর্তন করা) কাজ করে না, তাই আমি এটির অপ্রাসঙ্গিক কিনা তা নিশ্চিত নই।
র্যান্ড

4
@ সিমোনপালাজো এক্সএমএলে বিভিন্ন বিভিন্ন "নোড" রয়েছে - যেমন <anElement>a text node <aChildElement /> <![CDATA a cdata node]]> another text node</anElement>। সিডিএটিএ এবং টেক্সট নোডগুলি বিভিন্ন ধরণের, এবং সিম্পল এক্সএমএল এটি ট্র্যাক করে যাতে আপনি যে এক্সএমএলটি রেখেছিলেন তা ফিরে পেতে পারেন When বর্তমান নেমস্পেসে (উদাঃ <someNSPrefix:someElement />), পাঠ্যের মধ্যে শিশু উপাদানের অবস্থান ইত্যাদি LIBXML_NOCDATAসিডিএটিএ নোডগুলিকে পাঠ্য নোডগুলিতে রূপান্তর করে তবে বাকীটি ঠিক করে না।
আইএমএসওপি

52

দ্য LIBXML_NOCDATAঐচ্ছিক তৃতীয় প্যারামিটার simplexml_load_file()ফাংশন। এটি XML অবজেক্টকে সমস্ত সিডিএটিএ তথ্য স্ট্রিংয়ে রূপান্তর করে returns

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


সিম্পল এক্সএমএলে সিডিএটিএ ফিক্স করুন


LIBXML_NOCDATA আমার জন্য এই কাজটি তৈরি করেছে। পিএইচপি 5.3.5
মাইক_কে

4
আপনার উত্তরটি হ'ল এলআইবিএক্সএমএল_নোকডাটা অর্থ ব্যাখ্যা করে , ধন্যবাদ!
মারসিও মাজ্জাচাতো

14

এটি আমার জন্য কৌশলটি করেছে:

echo trim($entry->title);

আপনার সিডিটা রাখার প্রয়োজন হলে নিখুঁত (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": {}
   }
 */

সিম্পল এক্সএমলেমেন্ট উপাদানটি অ্যাক্সেস করার সময় এটি সিডিটিএ পায়:

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

আমি ব্যবহারটি বোধ করি LIBXML_NOCDATAকারণ json_encodeস্ট্রিং ingালাই বৈশিষ্ট্যটি ট্রিগার করতে সিম্পলএক্সএমলেমেণ্ট অ্যাক্সেস না করে, আমি একটি __toString()সমমান অনুমান করছি ।

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>", null, LIBXML_NOCDATA);
echo json_encode($xml);
/*
 {
   "content": "Hello, world!"
 }
*/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.