2012-04-07 3 views
3

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

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

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

Большое спасибо 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 

} 

ответ

1

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

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

Более подробно см http://php.net/function.simplexml-load-string.php#84365

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

4

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

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

Nice обходного – Pim

+0

Для полной справки: [Предопределенные константы] (https://secure.php.net/manual/en/libxml.constants.php) –

Смежные вопросы