2012-04-07 17 views
3

Ich habe eine Reihe von XML-Datei, die ich in mein Skript mit XMLReader laden, erstellen DOM-Objekt und dann in Simplexml konvertieren.CData in simplexml geöffnet von XMLReader

Problem ist eine der XML-Datei verwendet CDATA die simplexml ignoriert und normalerweise simplexml_load_file mit Ich würde die LIBXML_NOCDATA Parameter hinzufügen, aber wie ich simplexml_import_dom verwende ich kann nicht herausfinden, wie die CDATA im sceanrio unten zu ignorieren.

Irgendwelche Ideen bitte?

Vielen Dank Brett

$file = 'test.xml'; 
$reader = new XMLReader(); 
$reader->open($file);  
while ($reader->read()) 
{ 
    // are we in a product? 
    if ($reader->nodeType == XMLReader::ELEMENT && 
     strtolower($reader->localName) == 'product') 

    { 
     if (!$node = $reader->expand()) { 
      //do nothing 
     } 
     else { 
      // expand the node into a DOMNode 
     // Convert to SimpleXML via DOM, messy but SimpleXML is soo much nicer. 
     $dom = new DomDocument(); 
     $dom->appendChild($dom->importNode($node, true)); 
     $products = simplexml_import_dom($dom); 

     // do whatever we want to do with the product data 

} 

Antwort

1

Es scheint eine Menge Verwirrung und Fehlinformationen über SimpleXML Bei der Verarbeitung von CDATA-Knoten zu sein. Es "ignoriert" CDATA nicht, es merkt sich einfach, dass ein bestimmter Knoten in CDATA war, indem er ihn als ein Objekt und nicht als eine einfache Zeichenfolge darstellt.

Wenn Sie immer die gute Praxis befolgen, die Rückgabewerte von SimpleXML explizit in eine Zeichenfolge zu konvertieren, sollten Sie den Inhalt der CDATA einfach sehen.

Weitere Informationen finden sich http://php.net/function.simplexml-load-string.php#84365

Alternativ kann der LIBXML_NOCDATA Parameter, den Sie erwähnen können simplexml_load_string weitergegeben werden. Wenn Sie den XMLReader wirklich aus einem anderen Grund benötigen, können Sie vermutlich $reader->readOuterXML() statt über eine DOMDocument konvertieren.

4

Sie könnten versuchen, so etwas wie:

<?php 
$str = $dom->saveXML(); 
$product = simplexml_load_string($str, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS); 
+0

Nizza Abhilfe – Pim

+0

Für vollständige Referenz: [Vordefinierte Konstanten] (https://secure.php.net/manual/en/libxml.constants.php) –