2010-06-03 10 views
78

Ich habe festgestellt, dass bei Verwendung von SimpleXMLElement für ein Dokument, das diese CDATA-Tags enthält, der Inhalt immer NULL ist. Wie behebe ich das?PHP: Wie behandelt man <! [CDATA [mit SimpleXMLElement?

Auch, sorry für das Spammen über XML hier. Ich habe versucht, ein XML-basiertes Skript zu bekommen jetzt mehr Stunden zu arbeiten ...

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

ich den ersten Treffer auf Google versucht, wenn Sie für „SimpleXMLElement cdata“ suchen, aber das hat nicht funktioniert.

+0

Wie versuchen Sie, auf den Knotenwert zuzugreifen? Und ist SimpleXML eine Anforderung? – allnightgrocery

+0

Ich habe jede andere Funktion (xml2array und alle) ausprobiert, die ich im Internet finden konnte und SimpleXML scheint die einzige zu sein, die gute Ergebnisse liefert, außer dass die CDATA nicht funktioniert. – Angelo

+1

Wir machen viel XML-Parsing bei der Arbeit mit DOMDocument (http://www.php.net/manual/en/class.domdocument.php). Es funktioniert gut im Umgang mit CDATA. Geben Sie das kurz oder poste ein wenig mehr Code für uns, um zu sehen, wie Sie mit SimpleXML arbeiten. – allnightgrocery

Antwort

138

Sie greifen wahrscheinlich nicht richtig darauf zu. Sie können es direkt ausgeben oder als String darstellen. (In diesem Beispiel ist das Gießen überflüssig, da Echo automatisch tut sowieso)

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

Sie könnten mehr Glück mit LIBXML_NOCDATA haben:

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

Nein, PHP überspringt CDATA aus irgendeinem Grund vollständig. Irgendwelche anderen Ideen? – Angelo

+4

Dann ist es ein Fehler. Aktualisieren Sie PHP/libxml, bis es funktioniert (Ich hatte nie Probleme mit CDATA und SimpleXML.) Sie können Ihr Glück mit LIBXML_NOCDATA versuchen, andernfalls. –

+0

Direkt an. Ohne LIBXML_NOCDATA kommt das XML als falsch - unabhängig davon, wie es gemacht wird. Das konnte ich mit beiden Erstellungsmethoden beweisen ... $ x = new SimpleXMLElement ('', LIBXML_NOCDATA); $ y = simplexml_load_string ('', "SimpleXMLElement", LIBXML_NOCDATA); print_r ($ y); Ohne diese Option sind beide null. Ich wollte nur Ihre Behauptung sichern. – allnightgrocery

10

Dies hat den Trick für mich:

+0

Perfekt, wenn Sie die cdata (ohne LIBXML_NOCDATA) behalten müssen – maztch

30

Der LIBXML_NOCDATA ist optional dritter Parameter von simplexml_load_file() Funktion . Dies gibt das XML-Objekt zurück, wobei alle CDATA-Daten in Zeichenfolgen konvertiert werden.

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


Fix CDATA in SimpleXML

+0

LIBXML_NOCDATA ist, was diese Arbeit gemacht hat für mich. PHP 5.3.5 –

+0

Ihre Antwort ist diejenige, die die ** LIBXML_NOCDATA ** Bedeutung erklärt, danke! –

4

Dies funktioniert perfekt für mich.

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