PHP XMLReader从某个节点元素编号开始读取

时间:2017-12-27 06:03:35

标签: php xml xmlreader

不确定这是否可行,例如,如果我的XML文件有数百万" item"元素,我可以跳过1 - 100"项目"元素并开始阅读"项目"元素编号101?

XML示例:

<items>
   <item>
      <name>ABC</name>
      <price currency='USD'>100</price>
   </item>
   <item>
      <name>DEF</name>
      <price currency='USD'>120</price>
   </item>
   <!-- .... and a lot more item elements -->
</items>

这是我目前的代码:

$z = new XMLReader;
$z->open('1.xml');
$doc = new DOMDocument;
while ($z->read() && $z->name !== 'item');
$i = 1;
while ($z->name === 'item'){
   if($i<=100){
      $z->next('item');
   }else{
      $node = new SimpleXMLElement($z->readOuterXML());
      //doing my stuff here, extracting the node information of that <item>
      $z->next('item');
   }
   $i++;
}

从上面可以看出,我只是使用&#34; next&#34;跳过项目编号1-100,但这不是很有效。 如果你们可以提供帮助,我们会感激不尽。谢谢!

尝试了来自@DHRUV GUPTA的解决方案:

$xml=simplexml_load_file('1.xml',"SimpleXMLElement", LIBXML_COMPACT | LIBXML_PARSEHUGE);
$xml = json_encode($xml);
$xml = json_decode($xml,true);
for($i=99; $i<=104; $i++){
   echo $xml["item"][$i]["name"]."<br />";
}

但得到了#34;解析器错误:内存不足错误&#34;错误。

1 个答案:

答案 0 :(得分:0)

是的,可能需要循环浏览项目并从第99项开始。例如: -

$xml=simplexml_load_string($myXMLData) or die("Error: Cannot create object");
$xml = json_encode($xml); // encoding in json format
$xml = json_decode($xml,true); // again decode with second parameter true to get object as array
for($i=99; $i<count($xml['items']); $i++){
  // here you can use $xml['items'][$i] which will be 100th element
}

对于大文件,您需要在simplexml_load_string函数中使用LIBXML_PARSEHUGE标志。

simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE)

XML_PARSE_HUGE标志放松了解析器的任何硬编码限制。这会影响文档的最大深度或实体递归等限制,以及文本节点大小的限制。

在大文件的情况下增加php内存限制

ini_set('memory_limit','1024M');