2009-05-29 3 views
2
<rss version="2.0" 
    xmlns:media="http://search.yahoo.com/mrss/"> 
    <channel> 
     <title>Title of RSS feed</title> 
     <link>http://www.google.com</link> 
     <description>Details about the feed</description> 
     <pubDate>Mon, 24 Nov 08 21:44:21 -0500</pubDate> 
     <language>en</language> 
     <item> 
      <title>Article 1</title> 
      <description><![CDATA[How to use StackOverflow.com]]></description> 
      <link>http://youtube.com/?v=y6_-cLWwEU0</link> 
      <media:player url="http://youtube.com/?v=y6_-cLWwEU0" /> 
      <media:thumbnail url="http://img.youtube.com/vi/y6_-cLWwEU0/default.jpg" 
       width="120" height="90" /> 
      <media:title>Jared on StackOverflow</media:title> 
      <media:category label="Tags">tag1,tag2</media:category> 
      <media:credit>Jared</media:credit> 
      <enclosure url="http://youtube.com/v/y6_-cLWwEU0.swf" 
       length="233" 
       type="application/x-shockwave-flash"/> 
     </item> 
    </channel> 
</rss> 

Я решил использовать XMLReader для анализа больших файлов xml. У меня возникли проблемы с получением данных внутри каждого элемента особенно миниатюрыParsing Media RSS с помощью XMLReader

Вот мой код

////////////////////////////// 

$itemList = array(); 
$i=0; 
$xmlReader = new XMLReader(); 
$xmlReader->open('XMLFILE'); 
while($xmlReader->read()) { 
    if($xmlReader->nodeType == XMLReader::ELEMENT) { 
      if($xmlReader->localName == 'title') { 
        $xmlReader->read(); 
      $itemList[$i]['title'] = $xmlReader->value; 
     } 
     if($xmlReader->localName == 'description') { 
      // move to its textnode/child 
      $xmlReader->read(); 
      $itemList[$i]['description'] = $xmlReader->value; 

     } 
      if($xmlReader->localName == 'media:thumbnail') { 
      // move to its textnode/child 
      $xmlReader->read(); 
      $itemList[$i]['media:thumbnail'] = $xmlReader->value; 
        $i++; 
     }  
    } 
} 
//////////////// 

ли это целесообразно использовать DOMXPath, так как я был разборе огромный файл XML? Я очень ценю ваш совет.

+0

Hooorayy !! Спасибо за редактирование. :) –

ответ

5

кстианские,

Если использование памяти вашего беспокойство, я бы рекомендовал держаться подальше от DOM/XPath, как это требует, чтобы весь файл читается в память первым. XMLReader читает только фрагмент за один раз (вероятно, 8K, как кажется, стандартный размер PHP Chunk).

я переписан, что вы первоначально размещены и он фиксирует следующие элементы, содержащиеся внутри <item> элемента:

  1. title
  2. description
  3. media:thumbnail
  4. media:title

Вещь лет Вы должны помнить, что XMLReader::localName вернет имя элемента за вычетом любой декларации XMLNS (например, media:thumbnail - localName - thumbnail). Вы должны быть осторожны, так как значение media:title может перезаписать значение title.

Вот что я переписал:

<?php 
define ('XMLFILE', dirname(__FILE__) . '/Rss.xml'); 
echo "<pre>"; 

$items = array(); 
$i = 0; 

$xmlReader = new XMLReader(); 
$xmlReader->open (XMLFILE, null, LIBXML_NOBLANKS); 

$isParserActive = false; 
$simpleNodeTypes = array ("title", "description", "media:title"); 

while ($xmlReader->read()) 
{ 
    $nodeType = $xmlReader->nodeType; 

    // Only deal with Beginning/Ending Tags 
    if ($nodeType != XMLReader::ELEMENT && $nodeType != XMLReader::END_ELEMENT) 
    { 
     continue; 
    } 
    else if ($xmlReader->name == "item") 
    { 
     if (($nodeType == XMLReader::END_ELEMENT) && $isParserActive) 
     { 
      $i++; 
     } 
     $isParserActive = ($nodeType != XMLReader::END_ELEMENT); 
    } 

    if (!$isParserActive || $nodeType == XMLReader::END_ELEMENT) 
    { 
     continue; 
    } 

    $name = $xmlReader->name; 

    if (in_array ($name, $simpleNodeTypes)) 
    { 
     // Skip to the text node 
     $xmlReader->read(); 
     $items[$i][$name] = $xmlReader->value; 
    } 
    else if ($name == "media:thumbnail") 
    { 
     $items[$i]['media:thumbnail'] = array (
      "url" => $xmlReader->getAttribute("url"), 
      "width" => $xmlReader->getAttribute("width"), 
      "height" => $xmlReader->getAttribute("height") 
     ); 
    } 
} 

var_dump ($items); 

echo "</pre>"; 

?> 

Если у вас есть какие-либо вопросы о том, как это работает, я был бы более чем счастлив ответить на них для вас.

+0

Спасибо за ваш ответ, я получил вашу идею. Но теперь проблема заключается в том, что у меня было тысячи данных, обработанных из 80 МБ XML, любая идея, как вставить это в базу данных mysql как пакетную? то есть. на 100 с помощью PHP? – text

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