Giter Club home page Giter Club logo

Comments (29)

vkuznetsov avatar vkuznetsov commented on June 20, 2024

надо в map или параметр с названием вложенных элементов передавать
или делать как-то так:

map :categories do
  element :category do
    attributes :id, :parentId => :parent_id
  end
end

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

@vkuznetsov обновил

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

А почему у тебя обращение не вот такое?

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

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

@Strech можно, конечно, и использовать method_missing, но это будет не оч. быстро, да и непонятно тогда, как быть, если встретится атрибут text

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

@take-five А если без миссинга, а по карте создавать методы доступа?
Ну и можно системные методы доступа типа text завернуть ...

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

@Strech да можно и так, только не в первую очередь

Я все же сначала хочу сделать хороший DSL для описания структуры документа

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

А что есть для namespace?

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' xml:lang='en' id='33758cb8-0122-4f54-8807-2936de0e20f4' from='vines.machines.dev' version='1.0'>

или

<stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls></stream:features>

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Можно то же самое, только строками:

Ox::Mapper.document do
  map 'stream:stream' do
  end
end

Можно передавать параметр:

Ox::Mapper.document do
  map :stream, :namespace => :stream do
  end
end

Можно делать, как в рельсе:

Ox::Mapper.document do
  namespace :stream do
    map :stream do
    end
  end
end

Как лучше?

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

Мне понравились вариант 1 и 2, 3-ий выглядит запутано

А еще вопрос, т.е для доступа к <required/> из второго примера, мне надо написать так?

Ox::Mapper.document do
  map :stream, :namespace => :features do
    map :starttls do
      element :required
    end
  end
end

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Не оч. понял, а что именно ты хочешь получить из второго примера?

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

Элемент required да/нет есть он или нет starttls.requred

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Тогда так

Ox::Mapper.document do
  map :starttls, :scope => 'stream:features' do
    element :required
  end
end

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

Нормально вроде бы

from ox-mapper.

vkuznetsov avatar vkuznetsov commented on June 20, 2024

👍

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

👍

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

@Strech а можешь прислать XML-документы, которые ты обрабатываешь?

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Господа, еще предлагаю совместно подумать над названиями методов в DSL. Имена map, element и element_value придуманы наспех и, честно говоря, не очень-то мне нравятся.

Смотрите, сейчас есть такие слова:

  • map - означает, что указанные элементы будут попадать в финальную выборку.
  • element - указывает, что указанный элемент будет доступен как свойство родительского элемента.
  • element_value - указывает, что текстовое значение данного элемента будет доступно как атрибут родительского элемента
  • attribute - указывает, что указанный атрибут элемента будет доступен как атрибут родительского элемента (простите за тафтологию)
  • collection - указывает, что элементы с заданным именем будут доступны в родительском объекте как свойство (массив)

Давайте подумаем, как можно лучше назвать методы map, element и element_value, а то эти названия какие-то не говорящие

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Можно вообще установить такое правило, что в финальную выборку попадают только элементы, объявленные непосредственно в блоке Ox::Mapper.document do ... end на первом уровне

from ox-mapper.

Strech avatar Strech commented on June 20, 2024
<!-- 1 -->
<body xmlns="http://jabber.org/protocol/httpbind" xmlns:stream="http://etherx.jabber.org/streams">
  <stream:features>
    <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
  </stream:features>
</body>

<!-- 2 -->
<body xmlns="http://jabber.org/protocol/httpbind">
  <stream:features xmlns:stream="http://etherx.jabber.org/streams"/>
</body>

<!-- 3 -->
<body xmlns="http://jabber.org/protocol/httpbind">
  <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
</body>

<!-- 4 -->
<body xmlns="http://jabber.org/protocol/httpbind" xmlns:xmpp="urn:xmpp:xbosh" xmlns:stream="http://etherx.jabber.org/streams" charsets="UTF-8" from="im.test-pulscen.ru" hold="1" inactivity="20" polling="5" requests="2" sid="d4b05531-63ff-4ee9-b988-49aefbd7b54e" ver="1.6" wait="60" xmpp:version="1.0">
  <stream:features>
    <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
      <mechanism>PLAIN</mechanism>
    </mechanisms>
  </stream:features>
</body>

from ox-mapper.

vkuznetsov avatar vkuznetsov commented on June 20, 2024

Поддерживаю отмену map в пользу вывода только корневого уровня (Смысла писать map внутри другого map нет)
element, по-моему, название нормальное.
Когда он вызывается с блоком то производится разбор аттрибутов и вложенных элементов. Если блока нет, то используется только значение. Т.о. от element_value можно отказаться.

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

element_value не нравится

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Т.о. остается три метода: element, attribute и collection. Да, это уже гораздо лучше

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Вместо маловнятного слова scope можно использовать более понятное слово under:

Ox::Mapper.document do
  element :category, :under => :categories

  under :shop do
    under :offers do
      element :offer
    end
  end
end

Как считаете?

from ox-mapper.

Strech avatar Strech commented on June 20, 2024
Ox::Mapper.document do
  element :category, :inside => :categories

  inside :shop do
    inside :offers do
      element :offer
    end
  end
end

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

inside - тоже хорошо )

Вова, как считаешь?

from ox-mapper.

vkuznetsov avatar vkuznetsov commented on June 20, 2024

А чем scope непонятен?

from ox-mapper.

vkuznetsov avatar vkuznetsov commented on June 20, 2024

Если не scope, то плюсую inside

from ox-mapper.

take-five avatar take-five commented on June 20, 2024

Подытожим:

parser = Ox::Mapper.document do
  inside :shop do
    inside :categories do
      element :category do
        attribute :id
        attribute :parentId, :as => :parent_id
      end # </category>
    end # </categories>

    inside :offers do
      element :offer do
        attributes :id, :available

        element :name
        element :categoryId, :as => :category_id
        element :price do
          attribute :currencyId, :as => :currency_id
        end

        collection :params do
          element :param, :attributes => :name
        end
      end # </offer>
    end # </offers>
  end # </shop>
end

По-моему, получилось секси )

from ox-mapper.

Strech avatar Strech commented on June 20, 2024

@take-five @vkuznetsov Да, вышло круто, легко читается и выглядит круто

from ox-mapper.

Related Issues (2)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.