php xml – системная ошибка при парсинге документа.
Всем привет! Сегодня я хочу Вам рассказать, как бороться может не со столь популярной, ошибкой парсинга в php xml документе. Но если честно, то ошибка очень интересная, решал я ее по просьбе заказчика с фриланса, и вот решил рассказать вам, чтобы если что, то знали как бороться.
В какой стороне ошибка я точно сказать немогу, это может быть, как и сторона php так и его модуля simplexml по работе с xml php. Ошибка заключается в том, что если в xml документе есть объекты, названия которых содержат «-» (знак тире), то из php обратится к ним не получится, и даже ошибка не высветится. Лучше покажу вам xml документ, так будет наглядней.
<messages> <message> <transaction-id>768765324</transaction-id> <time>19-11-2004 12:34:34.123</time> <keyword>KEYWORD</keyword> <provider>bee</provider> <short-number>8881</short-number> <phone>79161234567</phone> <text>PRIVET VSEM!</text> <money>1.36</money> <region-id>1</region-id> </message> </messages>
Как видим из кода выше, объекты содержат тире, например: transaction-id, short-number, region-id. Кстати говоря, этот xml какой-то платежной системы или биллинга. Руки бы оторвал за такое.
Теперь, когда нам известна ошибка можно перейти к решению проблемы, а именно, использовать xpath при выборке данных + проявить смекалку. Следующий код это демонстрирует.
$messages = simplexml_load_file('transactions.xml'); $transaction='transaction-id'; $short='short-number'; $region='region-id'; foreach($messages->xpath('/messages/message') as $item){ echo "<p>". $item->time. "</p>"; echo "<p>". $item->$transaction."</p>"; echo "<p>". $item->text. "</p>"; echo "<p>". $item->keyword. "</p>"; echo "<p>". $item->provider. "</p>"; echo "<p>". $item->$short. "</p>"; echo "<p>". $item->phone. "</p>"; echo "<p>". $item->money. "</p>"; echo "<p>". $item->$region. "</p>"; }
Как видим из кода, мы поместили названия проблемных объектов в переменные и потом подставляем название переменных в нужном месте. В принципе, ничего сложного нет и можно всегда пользоваться таким способом, но просто, зачем делают такую структуру документа, непонятно.
На этом все. С 5 июля я в отпуске и меня не будет 3 недели, так что посты продолжу писать по приезду.