Ordering XML Attributes with Hpricot?

Discussion in 'Ruby' started by Lance Pollard, Sep 24, 2009.

  1. Hey,

    Is there a way to organize/print out the xml attributes using Hpricot,
    or do I have to run through the xml file again and replace patterns?

    I would like to be able to say "put this attribute first, put this
    attribute next ...", so I can say, I want this:

    <node id="name" property="value"/>

    not this:

    <node property="value" id="name"/>

    Since the attributes are kept in a hash there's no order to them, so
    they appear in seemingly random order, but it's the same random order
    consistently.

    Any ideas how to do that?

    And is there a way to say "after two attributes, make a new line". So I
    can print out xml that can be edited by humans like code.

    Thanks,
    Lance
    --
    Posted via http://www.ruby-forum.com/.
    Lance Pollard, Sep 24, 2009
    #1
    1. Advertising

  2. Lance Pollard

    Axel Etzold Guest

    Dear Lance,

    >
    > Since the attributes are kept in a hash there's no order to them, so
    > they appear in seemingly random order, but it's the same random order
    > consistently.
    >
    > Any ideas how to do that?
    >


    a Hash can be sorted to give an Array with Hash#sort :

    http://ruby-doc.org/core/classes/Hash.html#M002865


    > And is there a way to say "after two attributes, make a new line". So I
    > can print out xml that can be edited by humans like code.


    You can then iterate through the Array with Array#each_with_index,
    eg.

    my_array.each_with_index{|x,i|





    >
    > Thanks,
    > Lance
    > --
    > Posted via http://www.ruby-forum.com/.


    --
    Jetzt kostenlos herunterladen: Internet Explorer 8 und Mozilla Firefox 3.5 -
    sicherer, schneller und einfacher! http://portal.gmx.net/de/go/chbrowser
    Axel Etzold, Sep 24, 2009
    #2
    1. Advertising

  3. Lance Pollard

    Axel Etzold Guest

    Dear Lance,

    I accidentally hit the "send" button too early:

    >
    > Since the attributes are kept in a hash there's no order to them, so
    > they appear in seemingly random order, but it's the same random order
    > consistently.
    >
    > Any ideas how to do that?
    >


    a Hash can be sorted to give an Array with Hash#sort :

    http://ruby-doc.org/core/classes/Hash.html#M002865


    > And is there a way to say "after two attributes, make a new line". So I
    > can print out xml that can be edited by humans like code.


    You can then iterate through the Array with Array#each_with_index,
    eg.

    my_array.each_with_index{|x,i| if i%2==0 ; p x + "\n"; else p x; end}

    Best regards,

    Axel




    --
    Neu: GMX Doppel-FLAT mit Internet-Flatrate + Telefon-Flatrate
    für nur 19,99 Euro/mtl.!* http://portal.gmx.net/de/go/dsl02
    Axel Etzold, Sep 24, 2009
    #3
  4. Thanks a lot axel, I'll give these a try

    Best,
    Lance

    Axel Etzold wrote:
    > Dear Lance,
    >
    > I accidentally hit the "send" button too early:
    >
    >>
    >> Since the attributes are kept in a hash there's no order to them, so
    >> they appear in seemingly random order, but it's the same random order
    >> consistently.
    >>
    >> Any ideas how to do that?
    >>

    >
    > a Hash can be sorted to give an Array with Hash#sort :
    >
    > http://ruby-doc.org/core/classes/Hash.html#M002865
    >
    >
    >> And is there a way to say "after two attributes, make a new line". So I
    >> can print out xml that can be edited by humans like code.

    >
    > You can then iterate through the Array with Array#each_with_index,
    > eg.
    >
    > my_array.each_with_index{|x,i| if i%2==0 ; p x + "\n"; else p x; end}
    >
    > Best regards,
    >
    > Axel


    --
    Posted via http://www.ruby-forum.com/.
    Lance Pollard, Sep 25, 2009
    #4
  5. This means though I have to do two passes on the XML:

    1) Modify the nodes with data the way nokogiri or hpricot do it (xpath
    and whatnot)
    2) Format the xml using regular expression on pure strings, not using
    the xml parsing engines.

    Is that correct?

    Thanks,
    Lance
    --
    Posted via http://www.ruby-forum.com/.
    Lance Pollard, Sep 25, 2009
    #5
  6. Lance Pollard

    Axel Etzold Guest

    -------- Original-Nachricht --------
    > Datum: Fri, 25 Sep 2009 10:54:03 +0900
    > Von: Lance Pollard <>
    > An:
    > Betreff: Re: Ordering XML Attributes with Hpricot?


    > This means though I have to do two passes on the XML:
    >
    > 1) Modify the nodes with data the way nokogiri or hpricot do it (xpath
    > and whatnot)
    > 2) Format the xml using regular expression on pure strings, not using
    > the xml parsing engines.
    >
    > Is that correct?


    Lance,

    I remember that Hpricot and Nokogiri both have pretty_print methods, but I have never used them. Also, I don't know whether "pretty" can be defined so that everybody agrees :)

    Best regards,

    Axel
    --
    Neu: GMX Doppel-FLAT mit Internet-Flatrate + Telefon-Flatrate
    für nur 19,99 Euro/mtl.!* http://portal.gmx.net/de/go/dsl02
    Axel Etzold, Sep 25, 2009
    #6
  7. 2009/9/25 Lance Pollard <>:
    > This means though I have to do two passes on the XML:
    >
    > 1) Modify the nodes with data the way nokogiri or hpricot do it (xpath
    > and whatnot)
    > 2) Format the xml using regular expression on pure strings, not using
    > the xml parsing engines.
    >
    > Is that correct?


    I would not work on the output XML via String replacements. I would
    rather adjust the output process. For example, if you would be
    working with REXML you could implement a Formatter which outputs
    attributes in a particular order. I don't know whether this can be
    done with Nokogiri or Hpricot as well or as easily.

    Kind regards

    robert


    require 'rexml/document'

    class OrderedAttributes < REXML::Formatters::pretty
    def write_element(elm, out)
    att = elm.attributes

    class <<att
    alias _each_attribute each_attribute

    def each_attribute(&b)
    to_enum:)_each_attribute).sort_by {|x| x.name}.each(&b)
    end
    end

    super(elm, out)
    end
    end

    doc = REXML::Document.new(DATA.read)

    fmt = REXML::Formatters::pretty.new
    fmt.write(doc, $stdout)
    puts

    fmt = OrderedAttributes.new
    fmt.write(doc, $stdout)
    puts

    __END__
    <foo battr="1" aattr="2" cattr="3">
    </foo>



    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, Sep 25, 2009
    #7
  8. > require 'rexml/document'
    >
    > class OrderedAttributes < REXML::Formatters::pretty
    > def write_element(elm, out)
    > att = elm.attributes
    >
    > class <<att
    > alias _each_attribute each_attribute
    >
    > def each_attribute(&b)
    > to_enum:)_each_attribute).sort_by {|x| x.name}.each(&b)
    > end
    > end
    >
    > super(elm, out)
    > end
    > end
    >
    > doc = REXML::Document.new(DATA.read)
    >
    > fmt = REXML::Formatters::pretty.new
    > fmt.write(doc, $stdout)
    > puts
    >
    > fmt = OrderedAttributes.new
    > fmt.write(doc, $stdout)
    > puts
    >
    > __END__
    > <foo battr="1" aattr="2" cattr="3">
    > </foo>


    Thanks a lot Robert, I will try that out immediately.

    Best,
    Lance
    --
    Posted via http://www.ruby-forum.com/.
    Lance Pollard, Sep 25, 2009
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Arturius mac Aidan

    Why is XML "stupid" about element ordering?

    Arturius mac Aidan, Oct 30, 2005, in forum: XML
    Replies:
    5
    Views:
    401
    Peter Flynn
    Oct 31, 2005
  2. Replies:
    3
    Views:
    2,836
  3. David Pratt
    Replies:
    3
    Views:
    297
    David Pratt
    Jan 19, 2009
  4. nbigaouette

    Z-Ordering (Morton ordering) question

    nbigaouette, Nov 5, 2009, in forum: C Programming
    Replies:
    2
    Views:
    2,151
  5. Arunprabu Durairaju

    Builder gem - xml attributes ordering

    Arunprabu Durairaju, Jun 7, 2007, in forum: Ruby
    Replies:
    5
    Views:
    181
    Keith Fahlgren
    Jun 7, 2007
Loading...

Share This Page