2014-11-12 3 views
0

У меня есть xml-файл размером около 200 МБ, поэтому я решил использовать XMLreader для извлечения необходимой мне информации.Как обработать этот большой XML-файл с помощью XMLreader?

Вот фрагмент из XML в этом файле:

<product> 
    <manufacturer>Blue Widgets</manufacturer> 
    <price>6.79</price> 
    <condition>new</condition> 
</product> 
<product> 
    <manufacturer>Green Widgets</manufacturer> 
    <price>9.99</price> 
    <condition>new</condition> 
</product> 
<product> 
    <manufacturer>Black Widgets</manufacturer> 
    <price>3.29</price> 
    <condition>new</condition> 
</product> 
<product> 
    <manufacturer>Blue Widgets</manufacturer> 
    <price>14.99</price> 
    <condition>new</condition> 
</product> 

Из тысяч записей в этом большом файле, мне нужна только информация от тех, где производитель является «Blue Widgets», но я у меня возникают проблемы, выяснить, как изолировать только то, что производитель:

$reader = new XMLReader(); 
$reader->open('test.xml'); 

$products = array(); 

while($reader->read()){ 

     if($reader->nodeType == XMLREADER::ELEMENT && $reader->localName == 'manufacturer'){ 
     $reader->read(); 
     if($reader->value == 'Blue Widgets'){ 
      //Now that we know the manufacturer is right, how do I advance to the next price node within this product element? 
      if($reader->nodeType == XMLREADER::ELEMENT && $reader->localName == 'price'){ 
       $reader->read(); 

       $products['price'] = $reader->value 
     } 
     } 
    } 
    } 

ответ

1

Вы можете использовать метод XMLReader::next. Используя ваш пример:

... 
$reader->read(); 
if ($reader->value == 'Blue Widgets') { 
    $reader->next('price'); // Advances cursor to the price node 
} 
... 

Документация: http://php.net/manual/en/xmlreader.next.php