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

J'ai décidé d'utiliser XMLReader pour analyser mes gros fichiers XML. Je ne parviens pas à obtenir les données à l'intérieur de chaque élément en particulier la vignetteAnalyser le contenu RSS à l'aide de XMLReader

Voici mon code

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

$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++; 
     }  
    } 
} 
//////////////// 

est-il conseillé d'utiliser DOMXpath depuis que je suis analyse du fichier XML énorme? J'apprécie vraiment vos conseils.

+0

Hooorayy !! Merci pour l'édition. :) –

Répondre

5

xtian,

Si l'utilisation de la mémoire est une préoccupation de la vôtre, je vous recommande de rester loin des DOM/XPath car il faut que le fichier entier soit lu d'abord en mémoire. XMLReader lit seulement dans un morceau à la fois (probablement 8K car cela semble être la taille standard du chunk PHP).

Je re-écrit ce que vous avez initialement affiché et il capture les éléments suivants contenus dans un élément <item>:

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

La chose yo Vous devez vous rappeler que XMLReader::localName retournera le nom de l'élément moins toute déclaration XMLNS (par ex. media:thumbnaillocalName est thumbnail). Vous devrez faire attention à ce que la valeur media:title pourrait remplacer la valeur title.

Voici ce que je re-écrit:

<?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>"; 

?> 

Si vous avez des questions sur la façon dont cela fonctionne, je serais plus qu'heureux d'y répondre pour vous.

+0

Merci pour votre réponse, j'ai eu votre idée. Mais le problème maintenant est que j'ai eu des milliers de données analysées à partir de 80 Mo de XML, aucune idée de comment l'insérer dans la base de données MySQL en tant que lot? c'est à dire. par 100 en utilisant PHP? – text

Questions connexes