Skip to content

Новый DSL (обсуждение) #1

@take-five

Description

@take-five

Предположим, у нас есть XML-документ следующей структуры:

<?xml version="1.0" encoding="utf-8"?>
<shop>
  <categories>
    <category id="1">Electronics</category>
    <category id="2" parentId="1">Phones</category>
  </categories>

  <offers>
    <offer id="1" available="true">
      <name>iPhone 5</name>
      <categoryId>2</categoryId>
      <price currencyId="RUR">25000</price>
      <params>
        <param name="Color">White</param>
        <param name="Battery">2000 mA/h</param>
      </params>
    </offer>

    <offer>...</offer>
  </offers>
</shop>

Предлагается следующее API для создания парсера документа такой структуры:

parser = Ox::Mapper.document do
  # map означает, что по элементам с таким именем будет производиться итерация
  # :scope => :categories означает, что итерация будет производиться только по элементам
  # <category>, которые находятся внутри элементов <categories>
  map :category, :scope => :categories do
    # из элемента category мы берем атрибуты id и parentId, причем ко второму можно будет обратиться по имени parent_id
    attributes :id, :parentId => :parent_id
  end

  # :scope => '/shop/offers' означает, что итерация будет производиться только по элементам <offer>,
  # вложенным в элемент <offers>, вложенный в элемент <shop>, являющимся корневым
  map :offer, :scope => '/shop/offers' do
    attribute :id
    attribute :available

    # element_value означает, что из элемента <name> мы берем только его текст. к этому значению можно будет обратиться так - element[:name]
    element_value :name
    element_value :categoryId, :as => :category_id
    element :price do
      attribute :currencyId, :as => :currency_id
    end

    # множество однотипных элементов можно отобразить в коллекцию (массив)
    collection :params do
      element :param, :attributes => :name
    end
  end
end

parser.parse(STDIN) do |tag|
  case tag.name
    when :category
      p [tag.name, tag[:id], tag[:parent_id]]

    when :offer
      p [
        tag[:id],
        tag[:available],
        tag[:name],
        tag[:category_id],
        tag[:price][:currency_id], # вот это меня смущает
        tag[:price].text, # и это тоже
        tag[:params][0][:name],
        tag[:params][0].text,
        tag[:params][1][:name],
        tag[:params][1].text
      ]
  end
end

Очень приветствуются замечания и дополнения.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions