Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP SimpleXML,在foreach循环期间获取子行_Php_Xml_Simplexml - Fatal编程技术网

PHP SimpleXML,在foreach循环期间获取子行

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

我有一个脚本,通过从服务器上保存的文件加载的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>

产品一
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。