2011-07-21 34 views
1

我有一個腳本,通過從服務器上保存的文件加載的SimpleXML對象。現在,如果在處理XML文件時出現問題,我希望腳本報告錯誤,最好是發生錯誤的子項的行。PHP SimpleXML,在foreach循環中獲取子行

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); 
?> 

現在,我需要的是知道這裏的事情,是有辦法找到哪一行foreach循環中的當前子文件在XML文件中?

我知道libxml_get_errors()報告XML錯誤,但如果我確定某個產品存在缺陷,我想查明產品在XML文件中出現的行。

我在想什麼,我使用孩子的$ key來問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

+0

感謝您的答覆,您可以提供怎樣我的腳本示例以上可以使用DOM?因爲我不知道如何使用DOM來讀取XML。 –

+0

@Kristoffer:這很簡單。我已經更新了我的答案。 –

+0

謝謝,它的工作原理。我將在稍後爲我的腳本實現DOM。 –