PHP: <! [CDATA [SimpleXMLElement ile nasıl işlenir?


97

SimpleXMLElementBu CDATA etiketlerini içeren bir belgede kullanırken , içeriğin her zaman olduğunu fark ettim NULL. Bunu nasıl düzeltirim?

Ayrıca, burada XML hakkında spam gönderdiğiniz için özür dilerim. Birkaç saattir XML tabanlı bir script çalıştırmaya çalışıyorum ...

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

Google'da "SimpleXMLElement cdata" ararsanız ilk isabeti denedim, ancak bu işe yaramadı.


Düğüm değerine nasıl erişmeye çalışıyorsunuz? Ve SimpleXML bir gereklilik midir?
— allnightgrocery

Web'de bulabildiğim diğer tüm işlevleri (xml2array ve hepsi) denedim ve SimpleXML, CDATA'nın çalışmaması dışında İYİ sonuçlar veren tek şey gibi görünüyor.
— Angelo

1
DOMDocument ( php.net/manual/en/class.domdocument.php ) kullanarak işyerinde birçok XML ayrıştırma yapıyoruz . CDATA kullanımında gayet iyi çalışıyor. SimpleXML ile nasıl çalıştığınızı görmemiz için ona bir kısa bilgi verin veya biraz daha kod gönderin.
— allnightgrocery

Yanıtlar:


182

Muhtemelen doğru şekilde erişmiyorsunuz. Doğrudan çıktı alabilir veya bir dizge olarak çevirebilirsiniz. (bu örnekte, echo zaten otomatik olarak yaptığı için yayınlama gereksizdir)

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

Şunlarla daha iyi şansınız olabilir LIBXML_NOCDATA:

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

2
Hayır, PHP bazı nedenlerden dolayı CDATA'yı tamamen atlar. Başka fikrin var mı?
— Angelo

4
O zaman bu bir böcek. Çalışana kadar PHP / libxml'yi yükseltin (CDATA ve SimpleXML ile hiç sorun yaşamadım.) Aksi takdirde şansınızı LIBXML_NOCDATA ile denemek isteyebilirsiniz.
— Josh Davis

5
Bunun eski bir cevap olduğunu biliyorum, ancak bu cevabın ilk kısmının doğru olduğunu vurgulamak isterim . Sonucu birlikte yazdırdığınızda, print_rgerçekten doğru şekilde erişemiyorsunuz. Gerçekte istediğiniz kodu yazın - muhtemelen echobir (string)alçı ile veya bir oyuncu ile yazın ve içeriğin iyi olduğunu göreceksiniz. LIBXML_NOCDATA'yı kullanmayın, alakasızdır.
— IMSoP

7
@IMSoP LIBXML_NOCDATA eklemek (ve başka hiçbir şeyi değiştirmek) işe yarıyor, bu yüzden alakasız olduğundan pek emin değilim.
— rand

3
@SimonePalazzo XML, çeşitli farklı "düğümlerden" oluşur - örn <anElement>a text node <aChildElement /> <![CDATA a cdata node]]> another text node</anElement>. CDATA ve metin düğümleri farklı türlerdir ve SimpleXML bunu izler, böylece yerleştirdiğiniz XML'i geri alabilirsiniz. Bir SimpleXML nesnesini bir diziye sıkıştırdığınızda, pek çok bilgiyi atar - CDATA düğümleri, yorumlar, herhangi bir öğe geçerli ad alanında (örneğin <someNSPrefix:someElement />), alt öğenin metindeki konumu, vb. LIBXML_NOCDATACDATA düğümlerini metin düğümlerine dönüştürür, ancak geri kalanını düzeltmez.
— IMSoP

48

LIBXML_NOCDATAVe isteğe bağlı üçüncü bir parametredir simplexml_load_file()fonksiyonu. Bu, dizelere dönüştürülmüş tüm CDATA verileriyle XML nesnesini döndürür.

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


SimpleXML'de CDATA'yı düzeltin


LIBXML_NOCDATA, bunun benim için çalışmasını sağlayan şeydi. PHP 5.3.5
— Mike_K

1
Cevabınız, LIBXML_NOCDATA'nın anlamını açıklayan cevaptır , teşekkürler!
— Marcio Mazzucato

14

Bu benim için hile yaptı:

echo trim($entry->title);

CD verilerini saklamanız gerekiyorsa mükemmel (LIBXML_NOCDATA olmadan)
— maztch

Bunu soruya bir cevap olarak gösterebilir misin?
— Peter Højlund Andersen

10

Bu benim için mükemmel çalışıyor.

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

0

Ne zaman kullanılmalı LIBXML_NOCDATA?

XML'yi JSON'a dönüştürürken sorunu ekliyorum.

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

SimpleXMLElement nesnesine erişirken, CDATA'yı alır:

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

Kullanmak mantıklı LIBXML_NOCDATAçünkü json_encodeSimpleXMLElement'e dize döküm özelliğini tetiklemek için erişmeyin, bir __toString()eşdeğerini tahmin ediyorum .

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>", null, LIBXML_NOCDATA);
echo json_encode($xml);
/*
 {
   "content": "Hello, world!"
 }
*/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.