Comments (29)
надо в map или параметр с названием вложенных элементов передавать
или делать как-то так:
map :categories do
element :category do
attributes :id, :parentId => :parent_id
end
end
from ox-mapper.
@vkuznetsov обновил
from ox-mapper.
А почему у тебя обращение не вот такое?
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.
@Strech можно, конечно, и использовать method_missing, но это будет не оч. быстро, да и непонятно тогда, как быть, если встретится атрибут text
from ox-mapper.
@take-five А если без миссинга, а по карте создавать методы доступа?
Ну и можно системные методы доступа типа text
завернуть ...
from ox-mapper.
@Strech да можно и так, только не в первую очередь
Я все же сначала хочу сделать хороший DSL для описания структуры документа
from ox-mapper.
А что есть для 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.
Можно то же самое, только строками:
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.
Мне понравились вариант 1 и 2, 3-ий выглядит запутано
А еще вопрос, т.е для доступа к <required/>
из второго примера, мне надо написать так?
Ox::Mapper.document do
map :stream, :namespace => :features do
map :starttls do
element :required
end
end
end
from ox-mapper.
Не оч. понял, а что именно ты хочешь получить из второго примера?
from ox-mapper.
Элемент required да/нет есть он или нет starttls.requred
from ox-mapper.
Тогда так
Ox::Mapper.document do
map :starttls, :scope => 'stream:features' do
element :required
end
end
from ox-mapper.
Нормально вроде бы
from ox-mapper.
👍
from ox-mapper.
👍
from ox-mapper.
@Strech а можешь прислать XML-документы, которые ты обрабатываешь?
from ox-mapper.
Господа, еще предлагаю совместно подумать над названиями методов в DSL. Имена map
, element
и element_value
придуманы наспех и, честно говоря, не очень-то мне нравятся.
Смотрите, сейчас есть такие слова:
map
- означает, что указанные элементы будут попадать в финальную выборку.element
- указывает, что указанный элемент будет доступен как свойство родительского элемента.element_value
- указывает, что текстовое значение данного элемента будет доступно как атрибут родительского элементаattribute
- указывает, что указанный атрибут элемента будет доступен как атрибут родительского элемента (простите за тафтологию)collection
- указывает, что элементы с заданным именем будут доступны в родительском объекте как свойство (массив)
Давайте подумаем, как можно лучше назвать методы map
, element
и element_value
, а то эти названия какие-то не говорящие
from ox-mapper.
Можно вообще установить такое правило, что в финальную выборку попадают только элементы, объявленные непосредственно в блоке Ox::Mapper.document do ... end
на первом уровне
from ox-mapper.
<!-- 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.
Поддерживаю отмену map в пользу вывода только корневого уровня (Смысла писать map внутри другого map нет)
element, по-моему, название нормальное.
Когда он вызывается с блоком то производится разбор аттрибутов и вложенных элементов. Если блока нет, то используется только значение. Т.о. от element_value можно отказаться.
from ox-mapper.
element_value
не нравится
from ox-mapper.
Т.о. остается три метода: element
, attribute
и collection
. Да, это уже гораздо лучше
from ox-mapper.
Вместо маловнятного слова scope
можно использовать более понятное слово under
:
Ox::Mapper.document do
element :category, :under => :categories
under :shop do
under :offers do
element :offer
end
end
end
Как считаете?
from ox-mapper.
Ox::Mapper.document do
element :category, :inside => :categories
inside :shop do
inside :offers do
element :offer
end
end
end
from ox-mapper.
inside
- тоже хорошо )
Вова, как считаешь?
from ox-mapper.
А чем scope непонятен?
from ox-mapper.
Если не scope, то плюсую inside
from ox-mapper.
Подытожим:
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.
@take-five @vkuznetsov Да, вышло круто, легко читается и выглядит круто
from ox-mapper.
Related Issues (2)
- get updated xml back? HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ox-mapper.