Forum: Ruby Builder gem - xml attributes ordering

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Fc8d7edcd37a09698776a374309b54c2?d=identicon&s=25 Arunprabu Durairaju (arunprabu)
on 2007-06-07 18:14
Hi,

I am currently developing a xml service using Ruby on rails with builder
gem. Builder is a great tool to create xml easily. But the only and
important issue I am facing is - unable to set the order inwhich the
attributes to be displayed in the xml. Whatever order I give the
attributes of an element, Builder creates the attributes in a totally
different order. Request someone's help to overcome this issue. Please
specify even if there is another method to create this service which
return xml instead of html using REST instead of Builder.

Thanks in advance
Arun
0276239ca57aee241d4b41379587fa20?d=identicon&s=25 Lyle Johnson (Guest)
on 2007-06-07 18:47
(Received via mailing list)
On 6/7/07, Arunprabu Durairaju <arunprabu@gmail.com> wrote:

> I am ... unable to set the order in which the
> attributes to be displayed in the xml.

<snip>

Why do you think the attributes for an element *should* appear in any
particular order?
Fc8d7edcd37a09698776a374309b54c2?d=identicon&s=25 Arunprabu Durairaju (arunprabu)
on 2007-06-07 19:08
Lyle Johnson wrote:
> On 6/7/07, Arunprabu Durairaju <arunprabu@gmail.com> wrote:
>
>> I am ... unable to set the order in which the
>> attributes to be displayed in the xml.
>
> <snip>
>
> Why do you think the attributes for an element *should* appear in any
> particular order?

Hi Johnson,

The service We are developing is going to be used by and application and
persons. That is the service will be called from another application for
getting the data. In this case, the ordering is not a necessary thing.
But in case of reading the xml manually in a browser, it is easy to read
the data if it comes in a specified order. Because, there are 5 to 10
attributes to each elements in our xml. And it is tough to locate the
attribute each time.

Thanks
Arun
B7d00e6bd04c81d1fd78554a3d0c38b7?d=identicon&s=25 Keith Fahlgren (Guest)
on 2007-06-07 19:21
(Received via mailing list)
On 6/7/07, Lyle Johnson <lyle.johnson@gmail.com> wrote:
> On 6/7/07, Arunprabu Durairaju <arunprabu@gmail.com> wrote:
>
> > I am ... unable to set the order in which the
> > attributes to be displayed in the xml.
>
> <snip>
>
> Why do you think the attributes for an element *should* appear in any
> particular order?

To be explicit, Builder's behavior is acceptable because the order of
attributes in XML is not defined:

"""Note that the order of attribute specifications in a start-tag or
empty-element tag is not significant."""

http://www.w3.org/TR/REC-xml/



HTH,
Keith
Fc8d7edcd37a09698776a374309b54c2?d=identicon&s=25 Arunprabu Durairaju (arunprabu)
on 2007-06-07 19:30
Hi Johnson,

I understand that it is not specified in the XML specification and it is
not a requirement generally. But in languages like Java using Xerces,
the xml is generated with attributes in the sequence you have created
it. So just trying to find if there is any way to over come this issue.
I already have an alternative of constructing the xml as a string in the
sequence of attributes I need. But this is an ugly approach and trying
to find if there is any other alternative.

I also checked with REXML and it has the same behaviour as Builder.

Thanks
Arun
B7d00e6bd04c81d1fd78554a3d0c38b7?d=identicon&s=25 Keith Fahlgren (Guest)
on 2007-06-07 19:51
(Received via mailing list)
On 6/7/07, Arunprabu Durairaju <arunprabu@gmail.com> wrote:
> Hi Johnson,
>
> I understand that it is not specified in the XML specification and it is
> not a requirement generally.
>
> I also checked with REXML and it has the same behaviour as Builder.

Yeah, I'm sure they both use Hashes internally for attributes (and
Hashes are unordered in Ruby). However, it'd be easy to modify the
attribute insertion in Builder to take an Array instead. This is what
you'll have to change:

gems/builder-2.0.0/lib/builder/xmlmarkup.rb

    # Insert the attributes (given in the hash).
    def _insert_attributes(attrs, order=[])
      return if attrs.nil?
      order.each do |k|
  v = attrs[k]
  @target << %{ #{k}="#{_attr_value(v)}"} if v
      end
      attrs.each do |k, v|
  @target << %{ #{k}="#{_attr_value(v)}"} unless order.member?(k)
      end
    end


Keith
This topic is locked and can not be replied to.