CData в simplexml открыт из XMLReader

У меня есть куча XML-файла, который я загружаю в свой скрипт с помощью XMLReader, создавая объект DOM и затем конвертируя в Simplexml.

Проблема заключается в том, что один из файлов XML использует CDATA, который SIMPLEXML игнорирует и обычно использует SIMPLEXML_LOAD_FILE. Я бы добавил параметр LIBXML_NOCDATA, но поскольку я использую simplexml_import_dom, я не могу понять, как игнорировать CDATA в sceanrio ниже.

Любые идеи, пожалуйста?

Большое спасибо Бретту

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

Вы можете попробовать что-то вроде:

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

Кажется, что существует много путаницы и дезинформации об обработке SimpleXML для узлов CDATA. Он не «игнорирует» CDATA , он просто помнит, что определенный узел был в CDATA, представляя его как объект, а не просто строку.

Если вы всегда следуете за хорошей практикой перевода значений SimpleXML в явном виде на строку, вы должны увидеть содержимое CDATA просто отлично.

Дополнительные сведения см. В http://php.net/function.simplexml-load-string.php#84365

Кроме того, LIBXML_NOCDATA параметр LIBXML_NOCDATA можно передать в simplexml_load_string . Если вам действительно нужен XMLReader по какой-то другой причине, вы можете использовать $reader->readOuterXML() вместо преобразования через DOMDocument .