PHP SimpleXML,在foreach循环期间获取子行
我有一个脚本,通过从服务器上保存的文件加载的SimpleXML对象。现在,如果在处理XML文件时出现问题,我希望脚本报告错误,最好是报告发生错误的子行 一个XML示例:PHP SimpleXML,在foreach循环期间获取子行,php,xml,simplexml,Php,Xml,Simplexml,我有一个脚本,通过从服务器上保存的文件加载的SimpleXML对象。现在,如果在处理XML文件时出现问题,我希望脚本报告错误,最好是报告发生错误的子行 一个XML示例: <xml> <product> <name>Product one</name> <price>3.50</price> </product> <product> <name>Produ
<xml>
<product>
<name>Product one</name>
<price>3.50</price>
</product>
<product>
<name>Product two</name>
<price>42.00</price>
</product>
</xml>
产品一
3.50
产品二
42
我的脚本按如下方式处理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);
?>
现在,我需要知道的是,有没有办法找到foreach循环中的当前子循环在XML文件中的哪一行
我知道libxml\u get\u errors()
会报告XML错误行,但如果我确定某个产品存在缺陷,我想找出该产品在XML文件中出现的行
我在想一些事情,我用孩子的$key问simpleXML在哪里找到了那个孩子或者其他什么,但我不知道怎么做
如果有人有解决方案或建议,请随意分享。这在SimpleXML中是不可能的。但是,如果使用普通的PHPDOM,则可以使用获取任何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);
有关更多信息,只需检查SimpleXML无法使用的。但是,如果使用普通的PHPDOM,则可以使用获取任何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);
有关更多信息,请查看谢谢您的回复,您能否提供一个示例,说明我上面的脚本如何与DOM一起工作?因为我不知道如何使用DOM来读取XML。谢谢,它很管用。稍后我将在我的脚本中实现DOM。谢谢你的回复,你能提供一个例子说明我上面的脚本如何与DOM一起工作吗?因为我不知道如何使用DOM来读取XML。谢谢,它很管用。稍后我将在脚本中实现DOM。