SimpleXML,迭代所有元素

时间:2013-12-27 16:36:23

标签: php xml arrays simplexml iteration

我有一个股票报告文件(来自外部来源,因此我无法以任何方式进行修改),我想迭代所有元素(我必须将它们保存到MySQL表中)。我看到$ xml-> Stockfile是一个对象数组(2个项目),所以我试着把它放到一个数组中。

由于某种原因,$myarray仅包含$myarray = $xml->StockFile分配后的第一个元素。

这是我的代码:

$xml = simplexml_load_file("../docs/stock.xml"); 
print_r($xml);
$myarray = $xml->StockFile;
print_r($myarray);

stock.xml:

<NewDataSet>
  <StockFile>
    <MatrixID>1533</MatrixID>
    <Brand>myBrand</Brand>
    <ProductCode>001</ProductCode>
    <RRP>29.99</RRP>
    <Image2Name />
    <Image3Name />
  </StockFile>
  <StockFile>
    <MatrixID>1534</MatrixID>
    <Brand>myBrand</Brand>
    <ProductCode>002</ProductCode>
    <RRP>29.99</RRP>
    <Image2Name />
    <Image3Name />
  </StockFile>
</NewDataSet>

为什么我只获得一件而不是全部? 我该怎么做才能检索整个数组?

2 个答案:

答案 0 :(得分:1)

小心使用SimpleXMLElement。它有很多魔力。了解魔法或被print_rvar_dump或类似输出弄糊涂。你的例子扩展了:

$myarray = $xml->StockFile;
print_r($myarray); # shows one element

# foreach has both elements:
foreach($myarray as $name => $stockfile)
{
    echo $name, ":\n", $stockfile->asXML(), "\n\n";
}

即使它是相同的变量($myarray),它的行为也会有所不同,具体取决于它所使用的上下文。在foreachSimpleXMLElement(即该对象的类型)将在此处指定的名为StockFile的子元素上提供迭代器:

$myarray = $xml->StockFile;

但是在某种单一上下文中使用该变量,它将返回带有该名称的 first 子元素的内部字符串:

echo $myarray, "\n";

(在你的情况下只是一些空白行)。

请参阅演示:https://eval.in/83787

SimpleXML运行到这个“陷阱”实际上很常见。我建议通过手册中给出的示例了解基本用法:

答案 1 :(得分:0)

将最后两行更改为

foreach ($xml->StockFile as $nextStockFile) {
    print_r ($nextStockFile);
}