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
on 2009-09-24 23:08
on 2009-09-24 23:33
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|
on 2009-09-24 23:35
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
on 2009-09-25 03:19
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
on 2009-09-25 03:54
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
on 2009-09-25 12:35
-------- Original-Nachricht -------- > Datum: Fri, 25 Sep 2009 10:54:03 +0900 > Von: Lance Pollard <lancejpollard@gmail.com> > An: ruby-talk@ruby-lang.org > 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
on 2009-09-25 15:13
2009/9/25 Lance Pollard <lancejpollard@gmail.com>: > 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>
on 2009-09-25 17:18
> 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
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.