2011-07-21 9 views
1

サーバに保存されているファイルから読み込んだSimpleXMLオブジェクトを経由するスクリプトがあります。今、XMLファイルを処理している間に何か問題がある場合は、スクリプトがエラーを報告し、エラーが発生した子の行を報告することをお勧めします。PHP SimpleXML、foreachループ中に子ラインを取得する

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> 
    <product> 
    <name>Product one</name> 
    <price>3.50</price> 
    </product> 
    <product> 
    <name>Product two</name> 
    <price>42.00</price> 
    </product> 
</xml> 

私のスクリプトは、このようなXMLファイルを処理foreachループ内の現在の子がXMLファイル内のどの行にあるのかを調べてください。

私はlibxml_get_errors()がXMLエラーが発生しますが、製品に欠陥があると判断した場合、製品が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

+0

感謝をチェックし、あなたはどのように私のスクリプトの例を提供することができます上記のDOMで動作しますか?私はDOMを使ってXMLを読む方法がわからないからです。 –

+0

@Kristoffer:それはかなりシンプルです。私は私の答えを更新しました。 –

+0

ありがとう、それは動作します。後でスクリプトにDOMを実装します。 –

関連する問題