2010-09-06 4 views
8

Parsen habe ich eine XML-DateiErste cdata Inhalt während XML-Datei

<?xml version="1.0" encoding="utf-8"?> 
<xml> 
    <events date="01-10-2009" color="0x99CC00" selected="true"> 
     <event> 
      <title>You can use HTML and CSS</title> 
      <description><![CDATA[This is the description ]]></description> 
     </event> 
    </events> 
</xml> 

I verwendet XPath und XQuery und für das Parsen von XML.

$xml_str = file_get_contents('xmlfile'); 
$xml = simplexml_load_string($xml_str); 
if(!empty($xml)) 
{ 
    $nodes = $xml->xpath('//xml/events'); 
} 

Ich bin der Titel richtig bekommen, aber iam nicht immer description.How i Daten innerhalb CDATA bekommen

Antwort

8

SimpleXML ein bisschen ein Problem mit CDATA hat, so verwenden:

$xml = simplexml_load_file('xmlfile', 'SimpleXMLElement', LIBXML_NOCDATA); 
if(!empty($xml)) 
{ 
    $nodes = $xml->xpath('//xml/events'); 
} 
print_r($nodes); 

Dies gibt Ihnen:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [date] => 01-10-2009 
        [color] => 0x99CC00 
        [selected] => true 
       ) 

      [event] => SimpleXMLElement Object 
       (
        [title] => You can use HTML and CSS 
        [description] => This is the description 
       ) 

     ) 

) 
+0

Dank slomojo. Es funktioniert gut. – Warrior

+4

Falsch! SimpleXML hat kein Problem mit CDATA, und dies ist ein hartnäckiger Mythos, der nicht verewigt werden sollte. Es ist nur 'print_r', das den CDATA nicht sehen kann, weil SimpleXML seine Daten nicht wirklich als" echtes "PHP-Objekt speichert, sondern nur bei Bedarf hustet. – IMSoP

9

Du sein mis wahrscheinlich führte zu denken, dass die CDATA fehlt, indem print_r oder eine der anderen "normalen" PHP-Debugging-Funktionen verwendet. Diese können nicht den vollständigen Inhalt eines SimpleXML-Objekts sehen, da es kein "echtes" PHP-Objekt ist.

Wenn Sie echo $nodes[0]->Description ausführen, finden Sie Ihre CDATA kommt gut aus. Was passiert, ist, dass PHP weiß, dass echo einen String erwartet, also fragt SimpleXML nach einem; SimpleXML antwortet mit alle den String-Inhalt, einschließlich CDATA.

Um den vollen String-Inhalt zuverlässig zu erhalten, sagen Sie einfach PHP, dass Sie eine Zeichenfolge mit dem (string) Cast-Operator, z. $description = (string)$nodes[0]->Description.

Um SimpleXML Objekte zu debuggen und nicht durch Macken wie diese täuschen, eine spezielle Debug-Funktion, wie einer von ihnen verwenden: https://github.com/IMSoP/simplexml_debug

2

Dies auch eine andere sinnvolle Option sein könnte, die diesen Code entfernen würde und das Leben ein machen etwas einfacher.

$xml = str_replace("-", "_", $xml); 
$xml = str_replace("<![CDATA[", "", $xml); 
$xml = str_replace("]]>", "", $xml);