2011-07-21 2 views
1

У меня есть сценарий, который проходит через объект SimpleXML, загруженный из файла, который сохраняется на сервере. Теперь, если что-то не так, когда я обрабатываю XML-файл, я хочу, чтобы скрипт сообщал об ошибке, и предпочтительно, в строке ребенка, где произошла ошибка.PHP SimpleXML, get line of child во время цикла 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.

Я думал что-то, где я использую ключ $ ребенка, чтобы спросить 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 для моего скрипта позже. –

Смежные вопросы