【问题标题】:PHP SimpleXML, get line of child during foreach loopPHP SimpleXML,在foreach循环期间获取子行
【发布时间】:2011-07-21 01:48:21
【问题描述】:

我有一个脚本,它通过从保存在服务器上的文件加载的 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 它在哪里找到那个孩子或其他东西,但我不知道如何。

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

【问题讨论】:

    标签: php xml simplexml


    【解决方案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

    【讨论】:

    • 感谢您的回复,您能否提供一个示例,说明我上面的脚本如何与 DOM 一起工作?因为我不知道如何使用 DOM 来读取 XML。
    • 谢谢,它有效。稍后我将在我的脚本中实现 DOM。
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 2018-08-04
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多