Статья расчитана на тех, кто уже знаком с Feeds. Если нет, то вот что можно и нужно почитать: Импорт из CSV в сущность Drupal. Модуль Feeds, Импорт товаров и их дисплеев за один запуск Feeds + google ))

Для работы нам потребуется модуль Feeds XPath Parser (я использовал 7.x-1.x-dev версию) и все сопутствующие свистелки–перделки.

Парсить будем XML курсов валют Европейского центробанка.
https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml

Приведу пример структуры XML:

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
    <gesmes:subject>Reference rates</gesmes:subject>
    <gesmes:Sender>
        <gesmes:name>European Central Bank</gesmes:name>
    </gesmes:Sender>
    <Cube>
        <Cube time="2014-12-10">
            <Cube currency="USD" rate="1.2392"/>
            <Cube currency="JPY" rate="147.33"/>
            <Cube currency="BGN" rate="1.9558"/>
            <Cube currency="CZK" rate="27.618"/>
            <Cube currency="DKK" rate="7.4397"/>
            <Cube currency="GBP" rate="0.78975"/>
            <Cube currency="HUF" rate="307.21"/>
            <Cube currency="LTL" rate="3.45280"/>
            <Cube currency="PLN" rate="4.1619"/>
            <Cube currency="RON" rate="4.4430"/>
            <Cube currency="SEK" rate="9.3276"/>
            <Cube currency="CHF" rate="1.2024"/>
            <Cube currency="NOK" rate="8.8765"/>
            <Cube currency="HRK" rate="7.6680"/>
            <Cube currency="RUB" rate="67.2763"/>
            <Cube currency="TRY" rate="2.8000"/>
            <Cube currency="AUD" rate="1.4846"/>
            <Cube currency="BRL" rate="3.2105"/>
            <Cube currency="CAD" rate="1.4186"/>
            <Cube currency="CNY" rate="7.6526"/>
            <Cube currency="HKD" rate="9.6059"/>
            <Cube currency="IDR" rate="15298.55"/>
            <Cube currency="ILS" rate="4.8780"/>
            <Cube currency="INR" rate="76.9233"/>
            <Cube currency="KRW" rate="1369.94"/>
            <Cube currency="MXN" rate="17.8541"/>
            <Cube currency="MYR" rate="4.3088"/>
            <Cube currency="NZD" rate="1.6034"/>
            <Cube currency="PHP" rate="55.250"/>
            <Cube currency="SGD" rate="1.6263"/>
            <Cube currency="THB" rate="40.658"/>
            <Cube currency="ZAR" rate="14.2430"/>
        </Cube>
    </Cube>
</gesmes:Envelope>
  1. Парсить будем в ноду. Для примера добавим пару текстовых полей в стандартный тип материала Article, здесь все стандартно.
  2. Затем создадим importer /admin/structure/feeds с именем XML importer(например).
    • В настройках Parser импортера выбираем XPath XML parser;
    • Настройки Mapping for Node processor на скрине:
      Mapping for Node processor
  3. Сохраняем и идем в импортеры /import, где выбираем созданный нами XML importer.
  4. В настройках импортера:
    • URL укажите адрес XML файла, в нашем случае это https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
    • В XPath Parser Settings
      Там необходим тег Cube
      <Cube currency="RUB" rate="67.2763"/>

      Context //Cube/Cube/Cube
      Обратите внимание на вложенность тегов Cube в XML документе, там нужен 3-й, соответственно // выбираем тег Cube из контекста, затем / выбираем следующий тег Cube / и приходим к нужному

      Title string(@currency)
      Получаем содержимое атрибута currency

      field 1 string(@rate)
      Получаем содержимое атрибута rate

      field 2 @rate
      Получаем атрибут rate

      Обратите внимание.
      Что бы получить с помощью XPath атрибут тега целиком пишем @attributeName.
      Для получения содержимого атрибута необходимо писать string(@attributeName).

      Подробнее о XPath http://www.w3schools.com/xpath/

    • Скрин конфигурации импортера
      Feeds XPath Parser
  5. Нажимаем Import, получаем результат:

Готово! ))

Если XML тег будет иметь вид:

<Cube currency="USD">1.2392</Cube>

то запрос для получения текста внутри него будет таким:
Cube[@currency='USD']/node()
название_тега[@атрибут='имя_атрибута']/node()


Выразить благодарность

Если эта публикация оказалась для Вас полезной и вы хотите выразить свою благодарность, сделайте пожалуйста её репост в социальных сетях или на своём сайте.

Так же, Вы можете перевести любую сумму, которую посчитаете нужной на наш счёт, что сильно мотивирует к написанию новых полезных статей.

Комментарии: