Как настроить парсинг XML при помощи XMLReader на PHP для конкретного поставщика?

Имеется интернет-магазин, работающий на CMS 1C-Битрикс. Данные о товарах на сайт поступают после обработки xml-файлов от 7 разных поставщиков. После смены одним из поставщиков параметров в xml-файле перестали отображаться данные по остаткам. У остальных поставщиков данной проблемы не возникло. Обработка прайсов происходит при помощи XMLReader на PHP. Насколько я понимаю, из прай-листа поставщика берется строка, в которой (которых) описывается количество товара:

<param name="status">Ожидается</param>
<param name="status">В наличии</param>


или

<stock1>1</stock1>

Вот рабочие параметры из файла init.php:

case "param":
					if("status" != $xmlReader->getAttribute('name') && "Status" != $xmlReader->getAttribute('name')) continue;
					$xmlReader->read();
					
					if($xmlReader->nodeType == XMLReader::TEXT) {
						
						$text = $xmlReader->value;
						
						if(strpos($text,"В наличии") !== false){
							$result['available'] = true;
						}
						if(strpos($text,"менее") !== false){
							$result['available'] = true;
						}
					}
					break;
				case "stock":
					$xmlReader->read();
					if($xmlReader->nodeType == XMLReader::TEXT) {
						$stock = (string)$xmlReader->value;
						$stock = preg_replace("/[^0-9]/", '', strip_tags($stock));
						$result['available'] = (intVal($stock) > 0);
					}
					break;


У проблемного поставщика в xml-файле раньше были параметры "есть в наличии" и "нет в наличии", сейчас они такие:

<available>false</available>
<available>true</available>


Что нужно добавить в файл init.php, чтобы остатки товаров данного поставщика корректно отображалсь?
  • Вопрос задан
  • 1040 просмотров
Решения вопроса 1
semenukacola
@semenukacola Автор вопроса
Проблема решилась добавлением следующего кода:
case "available":
                     $xmlReader->read();
  
                    if($xmlReader->nodeType == XMLReader::TEXT) {
						$text = (string)$xmlReader->value;
						if($text == 'true') {
							$result['available'] = true;
						} else {
							$result['available'] = false;
						}     
                    }
                    break;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Farwisdomer
Моё мнение: нужно стандартизировать вид xml путем внедрения dtd или схемы. И доступность описать как аттрибут, к примеру <param name="status", available="true">. А так вы до бесконечности будете править код, один поставщик пришлет <available>false</available>, второй <available>no</available>, а третий <available>да нащальникамана, есть</available>. DTD же строго укажет допустимые значения аттрибута и значение по умолчанию. Тогда парсер будет един для всех заказчиков.
Ответ написан
@oldzas
Попробуйте это: https://github.com/prewk/xml-string-streamer
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы