Я использую xmlReader для анализа большого файла XML (~ 100 МБ). Что-то вроде этого
<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
<product>
<element_1>foo</element_1>
<element_2>foo</element_2>
<element_3>foo</element_3>
<element_4>foo</element_4>
</product>
<product>
<element_1>bar</element_1>
<element_2>bar</element_2>
<element_3>bar</element_3>
<element_4>bar</element_4>
</product>
<product>
<element_1>bar</element_1>
<element_2>bar</element_2>
<element_3>bar</element_3>
<element_4>bar</element_4>
</product>
<product>
<element_1>bar</element_1>
<element_2>bar</element_2>
<element_3>bar</element_3>
<element_4>bar</element_4>
</product>
<product>
<element_1>bar</element_1>
<element_2>bar</element_2>
<element_3>bar</element_3>
<element_4>bar</element_4>
</product>
</products>
Как нам пропустить первые два дерева и перейти к третьему?
XMLReader проходит через ваш файл построчно. Поскольку у вас нет идентификаторов (атрибутов) в вашем xml-файле, вы можете использовать решение для устранения проблем, пропустив продукт 1 и 2 с помощью «next ()»:
$xmlReader = new XMLReader;
// try to open
if (!$xmlReader->open($file)) {
die("Failed to open file");
}
// read the file
while($xmlReader->read()) {
// skip 1st product
if($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == "product") {$xmlReader->next("product");}
// skip 2nd product
if($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == "product") {$xmlReader->next("product");}
// start reading
if($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == "product") {
// use your code here
// personally I like using simplexml from here since its easier to work with and the nodes are usually small enough
$node = simplexml_load_string($xmlReader->readOuterXML());
// use it
$myNewElement1 = $node->element_1;
$myNewElement2 = $node->element_2;
$myNewElement3 = $node->element_3;
$myNewElement4 = $node->element_4;
}
}
Также перейдите к http://php.net/manual/en/xmlreader.next.php
Других решений пока нет …