2011-06-20 28 views
0

我正在使用PHP解析一個大的(約1.5 MB)XML文件。我想關注的節點大約有2層深度,對於每個節點,我希望能夠拉出某些值。使用帶有嵌套值的XMLReader

我一直希望使用SimplePie來做到這一點,但是從我讀過的內容來看,XMLReader似乎是最好的方法。我從來沒有使用XMLReader,並正在測試this example。不幸的是,它不適合我。

這裏是(一些)的XML:

<?xml version="1.0" encoding="UTF-8"?> 
    <comiclist> 
    <comic> 
     <id>117</id> 
     <index>1</index> 
     <mainsection> 
     <pagecount>33</pagecount> 
     <credits> 
      <credit> 
      <role id="dfPenciler">Penciller</role> 
      <roleid>dfPenciler</roleid> 
      <person> 
       <displayname>Jim Lawson</displayname> 
       <sortname>Jim Lawson</sortname> 
      </person> 
      </credit> 
      <credit> 
      <role id="dfWriter">Writer</role> 
      <roleid>dfWriter</roleid> 
      <person> 
       <displayname>Peter Laird</displayname> 
       <sortname>Peter Laird</sortname> 
      </person> 
      </credit> 
     </credits> 
     <characters/> 
     <series> 
      <displayname>Teenage Mutant Ninja Turtles</displayname> 
      <sortname>Teenage Mutant Ninja Turtles</sortname> 
      <complete>No</complete> 
      <bpseriesid>0</bpseriesid> 
     </series> 
     </mainsection> 
     <collectionstatus listid="3">In Collection</collectionstatus> 
     <rare boolvalue="0">No</rare> 
     <coverfront>/Data/Images/tmnt_2.jpg</coverfront> 
     <format> 
     <displayname>Standard Comic Format</displayname> 
     <sortname>Standard Comic Format</sortname> 
     </format> 
     <publisher> 
     <displayname>Mirage Studios</displayname> 
     <sortname>Mirage Studios</sortname> 
     </publisher> 
     <country> 
     <displayname>USA</displayname> 
     <sortname>USA</sortname> 
     </country> 
     <language> 
     <displayname>English</displayname> 
     <sortname>English</sortname> 
     </language> 
     <store> 
     <displayname>All About Books &amp; Comics</displayname> 
     <sortname>All About Books &amp; Comics</sortname> 
     </store> 
     <purchaseprice>$2.95</purchaseprice> 
     <coverprice>$2.95</coverprice> 
     <purchasedate> 
     <year> 
      <displayname>2003</displayname> 
     </year> 
     <month>1</month> 
     <date>January 2003</date> 
     </purchasedate> 
     <condition> 
     <displayname>Near Mint</displayname> 
     <sortname>094 Near Mint</sortname> 
     <lastname>094 Near Mint</lastname> 
     </condition> 
     <issuenr>2</issuenr> 
     <publicationdate> 
     <year> 
      <displayname>2002</displayname> 
     </year> 
     <month>2</month> 
     <date>February 2002</date> 
     </publicationdate> 
     <genres> 
     <genre> 
      <displayname>Science Fiction</displayname> 
      <sortname>Science Fiction</sortname> 
     </genre> 
     </genres> 
     <tags/> 
     <links/> 
     <lastmodified> 
     <date>10/4/2007 6:17:29 AM</date> 
     </lastmodified> 
     <thumbfilepath>/Thumbnails/6108a98d11f81eee6dbd2a67c20b1650.jpg</thumbfilepath> 
     <sections/> 
     <seriesgroup> 
     <displayname>Other</displayname> 
     <sortname>Other</sortname> 
     </seriesgroup> 
     <issue>2</issue> 
     <quantity>1</quantity> 
     <bpcomicid>0</bpcomicid> 
     <bpcomiclastreceivedrevision>0</bpcomiclastreceivedrevision> 
     <bpseriesid>0</bpseriesid> 
     <wraparoundcover boolvalue="0">No</wraparoundcover> 
     <seriefirstletter> 
     <displayname>T</displayname> 
     <sortname>T</sortname> 
     </seriefirstletter> 
     <allcreators>Jim Lawson; Peter Laird</allcreators> 
     <submissiondate/> 
     <releasedate/> 
     <readingdate/> 
     <readtimes>0</readtimes> 
     <readit>No</readit> 
    </comic> 
    </comiclist> 
</comicinfo> 

這裏是我使用的PHP:

<?php 
$z = new XMLReader; 
$z->open('comiclist.xml'); 

$doc = new DOMDocument; 

while ($z->read() && $z->name !== 'comic'); 

while ($z->name === 'comic') 
{ 

    $node = simplexml_import_dom($doc->importNode($z->expand(), true)); 

    var_dump($node->element_1); 

    $z->next('comic'); 
} 

?> 

什麼正在顯示是這樣的:

object(SimpleXMLElement)#3 (0) { } object(SimpleXMLElement)#4 (0) { } 

這對於每個節點一遍又一遍地重複。我做錯了什麼,有沒有更好的方法去做我想要完成的事情?

回答

0

我設法自己解決這個問題。

通過幾個小時的試驗&錯誤(和研究)我已經想出瞭如何完成我所要求的。下面爲其他人發佈測試代碼。這會爲每個「漫畫」節點打印出3個值:

<?php 
    $xml = simplexml_load_file('comiclist.xml'); 

    foreach ($xml->comiclist->comic as $comic) { 
    echo $comic->mainsection->series->displayname . ' #' . $comic->issuenr . ' is ID number: ' . $comic->id . '<br />'; 
    } 
?>