AronTito
@AronTito
разработчик-любитель web приложений и сайтов.

Как найти элементы в xml файле?

Всем привет!
Возникла такая проблемка. Пишем сейчас интернет каталог товаров, а выгрузку товаров проводим через программу 1С, по началу все шло хорошо, и случилась беда, структуру дерева в xml файле поменяли до безобразия. Не находит php блоки которые были ранее в назначенном месте, теперь они в каждом блоке стоят по разному. Приведу 2 примера:
Ранее...
<?xml version="1.0" encoding="UTF-8"?>
<Товар>
    <ид>1</ид>
    <Название>Тестовый товар 1</Название>
    <Описание>Детальное описание товара</Описание>
    <Цена>1000</Цена>
    <Картинка>tov0001.png</Картинка>
    ....
</Товар>
<Товар>
    <ид>2</ид>
    <Название>Тестовый товар 2</Название>
    <Описание>Детальное описание товара</Описание>
    <Цена>2000</Цена>
    <Картинка>tov0002.png</Картинка>
    ....
</Товар>

И так далее
С помощью php делалось так:
$xml = simplexml_load_file('file_import.xml');

$count_tovar = count($xml->Товар);

for ($i=0; $i < $count_tovar; $i++){
    echo 'ИД товара: '.$xml->Товар[$i]->ид.'<br>';
    echo 'Название товара: '.$xml->Товар[$i]->Название.'<br>';
    echo 'Цена товара: '.$xml->Товар[$i]->Цена.'<br>';
    echo 'Имя картинки: '.$xml->Товар[$i]->Картинка.'<br>';
    ...
}


Все так работало красиво и легко, циклом сканировал и переносил в mysql.
Тепер структура поменяла, и в каждом блоке <Товар> ... Товар> разная иерархия
Вот второй пример xml файла
<?xml version="1.0" encoding="UTF-8"?>
<Товар>
    <Ид>1</Ид>
    <Наименование>
        <НазваниеТовар>Тестовый товар 1</НазваниеТовара>
    </Наименование>
    <БазоваяЕдиница>
	<Пересчет>
		<Цена>200</Цена>
	</Пересчет>
    </БазоваяЕдиница>
    <ЗначенияРеквизитов>
        <ЗначениеРеквизита>
            <Описание>Описание товара</Описание>
        </ЗначениеРеквизита>
    </ЗначенияРеквизитов>
    <Значения>
        <Картинка>0001.png</Картинка>
    </Значения>
</Товар>
...
<Товар>
    <Ид>2</Ид>
    <Наименование>
        <НазваниеТовар>Тестовый товар 1</НазваниеТовара>
    </Наименование>
    <БазоваяЕдиница>
	<Пересчет>
            <Валюта>
		<Цена>200</Цена>
            </Валюта>
	</Пересчет>
    </БазоваяЕдиница>
    <ЗначенияРеквизитов>
        <ЗначениеРеквизита>
            <Описание>Описание товара</Описание>
            <Картинка>0001.png</Картинка>
        </ЗначениеРеквизита>
    </ЗначенияРеквизитов>
</Товар>

Примерно такой вот бардак я увидел, и вот что хотел унать, как с помощью php найти все блоки с названием <Картинка> и получить то, что написано в блоке <Картинка>0001.pngКартинка>
Помогите или подскажите где искать пример
  • Вопрос задан
  • 751 просмотр
Пригласить эксперта
Ответы на вопрос 1
@bears
Вы скорее всего только часть xml показали в вопросе, так как для всех товаров по идее должен быть общий узел, например "Товары". В этом случае, вот с такого xml файла:
<?xml version="1.0" encoding="UTF-8"?>
<Товары>
    <Товар>
        <Ид>1</Ид>
        <Наименование>
            <НазваниеТовара>Тестовый товар 1</НазваниеТовара>
        </Наименование>
        <БазоваяЕдиница>
      <Пересчет>
        <Цена>200</Цена>
      </Пересчет>
        </БазоваяЕдиница>
        <ЗначенияРеквизитов>
            <ЗначениеРеквизита>
                <Описание>Описание товара</Описание>
            </ЗначениеРеквизита>
        </ЗначенияРеквизитов>
        <Значения>
            <Картинка>0001.png</Картинка>
        </Значения>
    </Товар>
    <Товар>
        <Ид>1</Ид>
        <Наименование>
            <НазваниеТовара>Тестовый товар 2</НазваниеТовара>
        </Наименование>
        <БазоваяЕдиница>
      <Пересчет>
        <Цена>200</Цена>
      </Пересчет>
        </БазоваяЕдиница>
        <ЗначенияРеквизитов>
            <ЗначениеРеквизита>
                <Описание>Описание товара</Описание>
            </ЗначениеРеквизита>
        </ЗначенияРеквизитов>
        <Значения>
            <Картинка>0002.png</Картинка>
        </Значения>
    </Товар>
</Товары>

Вот такой php код вытащит все картинки:

$xml = simplexml_load_file('data.xml');

foreach ($xml->xpath('//Картинка') as $img) {
    echo $img . "\n";
}


Аналогично можно найти любые другие узлы. Подробнее тут например https://ru.wikipedia.org/wiki/XPath
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы