2009-05-29 9 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> 

大規模なxmlファイルを解析するXMLReaderを使用することにしました。私は特にサムネイルXMLReaderを使用してメディアRSSを解析する

をトラブル各項目内のデータを取得したのです。ここに私のコードは、私が巨大なXMLファイルを解析してから

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

$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を使うことの最大を使用することをお勧めですね。私は本当にあなたの助言に感謝します。

+0

Hooorayy !!編集していただきありがとうございます。 :) –

答えて

5

xtian、

メモリ使用量は、あなたの懸念がある場合、私はそれが全体のファイルが最初にメモリに読み込まれることを必要と離れDOM/XPathのからの滞在をお勧めします。 XMLReaderは一度にチャンクを読み込むだけです(おそらく標準のPHPチャンクサイズと思われる8Kです)。

あなたがもともと投稿何私は再書かれていると、それは<item>要素内に含まれ、次の要素キャプチャ:

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

をよーよXMLReader::localNameは要素名から任意のXMLNS宣言(例えば、 media:thumbnaillocalNamethumbnailです)。 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

あなたの返事をありがとう、私はあなたの考えを持っています。しかし、今問題は、何千ものデータが80MBのXMLから解析されたことです。これをバッチとしてどのようにmysqlデータベースに挿入できるのでしょうか?すなわち、 PHPを使って100で? – text

関連する問題