我有一个脚本,它通过从保存在服务器上的文件加载的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在哪里找到孩子或其他东西,但我不知道怎么做。
如果有人有解决方案或建议,请随时分享。
答案 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