У меня есть куча 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
.