【发布时间】:2019-07-14 18:59:20
【问题描述】:
我需要读取大约 1 GB 大小的 XML 文件。我的 XML:
<products>
<product>
<categoryName>Kable i konwertery AV</categoryName>
<brandName>Belkin</brandName>
<productCode>AV10176bt1M-BLK</productCode>
<productId>5616488</productId>
<productFullName>Kabel Belkin Kabel HDMI Ultra HD High Speed 1m-AV10176bt1M-BLK</productFullName>
<productEan>0745883767465</productEan>
<productEuroPriceNetto>59.71</productEuroPriceNetto>
<productFrontendPriceNetto>258.54</productFrontendPriceNetto>
<productFastestSupplierQuantity>23</productFastestSupplierQuantity>
<deliveryEstimatedDays>2</deliveryEstimatedDays>
</product>
<product>
<categoryName>Telewizory</categoryName>
<brandName>Sony</brandName>
<productCode>KDL32WD757SAEP</productCode>
<productId>1005662</productId>
<productFullName>Telewizor Sony KDL-32WD757 SAEP</productFullName>
<productEan></productEan>
<productEuroPriceNetto>412.33</productEuroPriceNetto>
<productFrontendPriceNetto>1785.38</productFrontendPriceNetto>
<productFastestSupplierQuantity>11</productFastestSupplierQuantity>
<deliveryEstimatedDays>6</deliveryEstimatedDays>
</product>
<product>
<categoryName>Kuchnie i akcesoria</categoryName>
<brandName>Brimarex</brandName>
<productCode>1566287</productCode>
<productId>885156</productId>
<productFullName>Brimarex Drewniane owoce, Kiwi - 1566287</productFullName>
<productEan></productEan>
<productEuroPriceNetto>0.7</productEuroPriceNetto>
<productFrontendPriceNetto>3.05</productFrontendPriceNetto>
<productFastestSupplierQuantity>7</productFastestSupplierQuantity>
<deliveryEstimatedDays>3</deliveryEstimatedDays>
</product>
</products>
我使用 XML 阅读器。
$reader = new XMLReader();
$reader->open($url);
$count = 0;
while($reader->read()) {
if($reader->nodeType == XMLReader::ELEMENT)
$nodeName = $reader->name;
if(($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA)) {
if ($nodeName == 'categoryName') $categoryName = $reader->value;
if ($nodeName == 'brandName') $brandName = $reader->value;
if ($nodeName == 'productCode') $productCode = $reader->value;
if ($nodeName == 'productId') $productId = $reader->value;
if ($nodeName == 'productFullName') $productFullName = $reader->value;
if ($nodeName == 'productEan') $productEan = $reader->value;
if ($nodeName == 'productEuroPriceNetto') $productEuroPriceNetto = $reader->value;
if ($nodeName == 'productFastestSupplierQuantity') $productFastestSupplierQuantity = $reader->value;
if ($nodeName == 'deliveryEstimatedDays') $deliveryEstimatedDays = $reader->value;
}
if($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == 'product') {
$count++;
}
}
$reader->close();
除一个问题外,一切正常...当缺少某个值时,例如输出中的<productEan></productEan>,我从前一个非空标签中获取一个值,直到另一个非空标签。
例如,如果前一个节点类似于示例中的 <productEan>0745883767465</productEan>,而另外两个 <productEan></productEan> 在输出数组中为空,我将得到相同的值,0745883767465。
解决这个问题的正确方法是什么?或者也许有人有可行的解决方案......
【问题讨论】:
-
还值得一看 stackoverflow.com/questions/1835177/how-to-use-xmlreader-in-php,它展示了如何读取整个产品项目,然后您可以将其作为 SimpleXML 记录处理(所以
$node->productEan) -
@Nick 建议的代码可以在最小的 xml 中正常工作。但是对于大型 XML,我会出现内存不足错误。所以现在有问题...
标签: php xml xml-parsing xmlreader