PHP SimpleXML,在foreach循环中获取子行

时间:2011-07-21 01:48:22

标签: php xml simplexml

我有一个脚本,它通过从保存在服务器上的文件加载的SimpleXML对象。现在,如果在处理XML文件时出现问题,我希望脚本报告错误,最好是发生错误的子行。

XML示例:

<xml>
  <product>
    <name>Product one</name>
    <price>3.50</price>
  </product>
  <product>
    <name>Product two</name>
    <price>42.00</price>
  </product>
</xml>

我的脚本像这样处理XML文件:

<?php
$log = 'Error log'.PHP_EOL;
$xml = simplexml_load_file('file.xml');
foreach($xml->'product' as $key->$val) {
  if(everything_is($okay)) {
    //process product
  }
  else {
    $log .= 'There was an error with the product on line '.$childLine.PHP_EOL;
  }
}
file_put_contents('log.txt',$log);
?>

现在,我需要知道的是,有没有办法找到XML文件中foreach循环中当前子节点所在的行?...

我知道libxml_get_errors()报告了XML错误的行,但是如果我确定产品有缺陷,我想找出产品在XML文件中出现的行。

我正在考虑使用孩子的$ key来询问simpleXML在哪里找到孩子或其他东西,但我不知道怎么做。

如果有人有解决方案或建议,请随时分享。

1 个答案:

答案 0 :(得分:1)

使用SimpleXML是不可能的。但是,如果您使用普通的PHP DOM,那么您可以使用DOMNode::getLineNo来获取任何DOM节点的行号。

因此,要么删除SimpleXML并选择完整的DOM,要么在出现错误时在完整的DOM中解析文档并在那里找到产品节点(及其行号)。

修改:这是一个DOM示例。它不是我的头脑,所以未经测试,但与你的完全相同:

$xml = new DOMDocument();
$xml->load('file.xml');

foreach ($xml->getElementsByTagName('product') as $product) {
    if (everything_is_okay($product)) {
        // do something
    } else {
        $log .= 'Bad product on line ' . $product->getLineNo();
    }
}

file_put_contents('log.txt',$log);

有关详细信息,请查看PHP DOM documentation