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.