Ruby Forum Ruby-core > REXML::Element.write is deprecated. See REXML::Formatters

Posted by Phlip (Guest)
on 16.01.2008 22:45
(Received via mailing list)
okay, I saw them. Now what?

More cogently, my associates upgraded to:

   ruby 1.8.6 (2007-09-24 patchlevel 111) [x86_64-linux]

Now my favorite methods just die, with this irrelevant error:

NoMethodError: missing attribute: `output` in <td id width>
     /usr/local/lib/ruby/1.8/rexml/element.rb:684:in `write'

So what's the modern equivalent of REXML::Element.write? Nothing fancy, 
just
pretty-print some XML so its legible?
Posted by Sam Ruby (rubys)
on 16.01.2008 23:24
(Received via mailing list)
Phlip wrote:
> 
> So what's the modern equivalent of REXML::Element.write? Nothing fancy, 
> just pretty-print some XML so its legible?

That's a bug.  It will be fixed in the next release of REXML, which
hopefully will be folded into subsequent releases of Ruby:

http://www.germane-software.com/projects/rexml/ticket/128

Meanwhile try something like the following:

require 'rexml/document'
foo = REXML::Document.new("<foo/>")
bar = REXML::Formatters::Default.new
out = String.new
bar.write(foo, out)
puts out

- Sam Ruby
Posted by Phlip (Guest)
on 17.01.2008 00:26
(Received via mailing list)
> Meanwhile try something like the following:

Thanks but...

> require 'rexml/document'
> foo = REXML::Document.new("<foo/>")
> bar = REXML::Formatters::Default.new

Now my Ruby 1.8.6-111 can't get around this:

   uninitialized constant REXML::Formatters

The source drop just contains:

   /usr/lib/lib/ruby/1.8/rexml$ ls formatter*
   default.rb  pretty.rb  transitive.rb

No formatters.rb to anchor them, so I can't just require 
'rexml/formatters'. And
  http://www.google.com/codesearch doesn't show any such thing waiting 
in the
wings...
Posted by Sam Ruby (rubys)
on 17.01.2008 01:14
(Received via mailing list)
Phlip wrote:
>   uninitialized constant REXML::Formatters
> 
> The source drop just contains:
> 
>   /usr/lib/lib/ruby/1.8/rexml$ ls formatter*
>   default.rb  pretty.rb  transitive.rb
> 
> No formatters.rb to anchor them, so I can't just require 
> 'rexml/formatters'. And  http://www.google.com/codesearch doesn't show 
> any such thing waiting in the wings...

I guess I'll let Sean take it from here, other than to note that .to_s
on an element still works...

- Sam Ruby
Posted by Phlip (Guest)
on 17.01.2008 02:28
(Received via mailing list)
> I guess I'll let Sean take it from here, other than to note that .to_s 
> on an element still works...

I understand you only mean that's a workaround - it is indeed already 
deployed.
But the complete rationale is useful here.

The goal of indent_xml() is to pretty-print tested XHTML so we can 
rapidly
read it. It could have come from a human (icky formatting), or from some 
HTML
generator (even ickier formatting!). And because HTML is not 
space-sensitive,
the best solution is to format it as beautifully as possible, to help 
you see
its structure and attributes.

assert_xpath needs all this in its diagnostics, so you can rapidly see 
why an
XPath was not found.
Posted by Sean E. Russell (Guest)
on 18.01.2008 17:17
(Received via mailing list)
On Wednesday 16 January 2008, Phlip wrote:
> > I guess I'll let Sean take it from here, other than to note that
> > .to_s on an element still works...
>
> I understand you only mean that's a workaround - it is indeed already
> deployed. But the complete rationale is useful here.

Your rationale, or mine?

write() was deprecated because a large number of tickets were about
pretty-printing: how it didn't do what people thought it would do, how
it could be improved, and (as much as anything else) how the hell to
use it.  The API was confusing and was only getting worse with age, and
any attempt to make the formatting more "logical" for one person
generated any number of complaints by other people.  The worst part,
for me, was that formatting was adding significant bloat to the code.
Ultimately, the right thing to do was to rip it out of the nodal
classes and create its own infrastructure.

However, write() should still work; it *should* just call a default
formatter to do the work.  That it doesn't is a bug.

As far as the missing Formatters class goes, any problems with REXML in
the Ruby repository are my fault; ironically, Ruby moving to Subversion
introduced some trouble on my end, as I had to start working with a new
tool (svk) which (a) I discovered that I didn't like very much, and (b)
my lack of knowledge about inevitably led to usage errors on my part.
Consequently, it looks like the Formatters class didn't make it into
the Ruby repository.

All of this should be fixed, assuming I don't make any more mistakes
(don't hold your breath on that) with the next minor revision release
this weekend.  Sam has been doing a huge amount of work with the
repository, and I'm creating a point release just to propegate his
fixes.  Hopefully, this will resolve your issues, and you should still
be able to use to_s() and write().

In case I haven't been clear, for simple, dumb dumping of XML, with no
promises about formatting, in the future you should use to_s().  This
is the convenience method.  If you want control about how the XML is
formatted, then use the Formatter API which -- I freely admit -- is
poorly (if at all) documented.

> The goal of indent_xml() is to pretty-print tested XHTML so we can
> rapidly read it. It could have come from a human (icky formatting),

One benefit of the new Formatter API is that it is now vastly more easy
to write your own formatters.

> or from some HTML generator (even ickier formatting!). And because
> HTML is not space-sensitive, the best solution is to format it as
> beautifully as possible, to help you see its structure and
> attributes.
>
> assert_xpath needs all this in its diagnostics, so you can rapidly
> see why an XPath was not found.

--
--- SER

Confidentiality Notice
This e-mail (including any attachments) is intended only for the 
recipients named above. It may contain confidential or privileged 
information and should not be read, copied or otherwise used by any 
other person. If you are not a named recipient, please notify the sender 
of that fact and delete the e-mail from your system.
Posted by Sean E. Russell (Guest)
on 18.01.2008 17:29
(Received via mailing list)
On Friday 18 January 2008, Sean E. Russell wrote:
> Confidentiality Notice
> This e-mail (including any attachments) is intended only for the
> recipients named above. It may contain confidential or privileged
> information and should not be read, copied or otherwise used by any
> other person. If you are not a named recipient, please notify the
> sender of that fact and delete the e-mail from your system.

Sorry about that.  If I'm not careful about my SMTP host, my company
attaches this idiotic and utterly useless crap at the bottom.
Posted by Sean E. Russell (Guest)
on 19.01.2008 20:35
(Received via mailing list)
On Wednesday 16 January 2008, Phlip wrote:
> The source drop just contains:
>
>    /usr/lib/lib/ruby/1.8/rexml$ ls formatter*
>    default.rb  pretty.rb  transitive.rb
>
> No formatters.rb to anchor them, so I can't just require

Formatters is a package, not a class, so you need:

> > require 'rexml/document'
require 'rexml/formatters/default'
> > foo = REXML::Document.new("<foo/>")
> > bar = REXML::Formatters::Default.new

Sorry I didn't catch this earlier.