【问题标题】:Using XMLReader with Nested Values将 XMLReader 与嵌套值一起使用
【发布时间】:2011-09-18 23:17:14
【问题描述】:

我正在使用 PHP 解析一个大的(大约 1.5 MB)XML 文件。我想要关注的节点大约有 2 层深,对于每个节点,我希望能够提取某些值。

我希望使用 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) { }

对于每个节点,这会一遍又一遍地重复。我做错了什么,有没有更好的方法来完成我想要完成的事情?

【问题讨论】:

    标签: php xml xmlreader


    【解决方案1】:

    我自己解决了这个问题。

    通过几个小时的反复试验(和研究),我已经弄清楚了如何完成我的要求。下面为其他人发布的测试代码。这会打印出每个“漫画”节点的 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 />';
      }
    ?> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2017-02-28
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多