diff options
Diffstat (limited to 'lib/rexml/document.rb')
-rw-r--r-- | lib/rexml/document.rb | 66 |
1 files changed, 54 insertions, 12 deletions
diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb index ee3e58dd2b..a915360c4f 100644 --- a/lib/rexml/document.rb +++ b/lib/rexml/document.rb @@ -31,9 +31,6 @@ module REXML # to be sources of valid XML documents. # @param context if supplied, contains the context of the document; # this should be a Hash. - # NOTE that I'm not sure what the context is for; I cloned it out of - # the Electric XML API (in which it also seems to do nothing), and it - # is now legacy. It may do something, someday... it may disappear. def initialize( source = nil, context = {} ) super() @context = context @@ -142,14 +139,53 @@ module REXML xml_decl().stand_alone? end - # Write the XML tree out, optionally with indent. This writes out the + # Write the XML tree out. This writes the entire XML document, including + # declarations and processing instructions. + # + # A controversial point is whether Document should always write the XML + # declaration (<?xml version='1.0'?>) whether or not one is given by the + # user (or source document). REXML does not write one if one was not + # specified, because it adds unneccessary bandwidth to applications such + # as XML-RPC. + # + # _Examples_ + # Document.new("<a><b/></a>").serialize + # + # output_string = "" + # tr = Transitive.new( output_string ) + # Document.new("<a><b/></a>").serialize( tr ) + # + # formatter:: + # One of the rexml/formatters classes. If none is given, then the Pretty + # formatter will be used to dump the XML to the STDOUT. + def serialize( formatter = nil ) + if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output) + output = Output.new( output, xml_decl.encoding ) + end + + formatter = REXML::Pretty.new( $stdout ) if (formatter.nil?) + + @children.each { |node| + puts "node = #{node.inspect}" + indent( output, indent ) if node.node_type == :element + if node.write( output, indent, transitive, ie_hack ) + output << "\n" unless indent<0 or node == @children[-1] + end + } + end + + # Write the XML tree out, optionally with indent. This writes out the # entire XML document, including XML declarations, doctype declarations, # and processing instructions (if any are given). + # # A controversial point is whether Document should always write the XML # declaration (<?xml version='1.0'?>) whether or not one is given by the # user (or source document). REXML does not write one if one was not # specified, because it adds unneccessary bandwidth to applications such # as XML-RPC. + # + # See also the classes in the rexml/formatters package for the proper way + # to change the default formatting of XML output # # # output:: @@ -160,7 +196,7 @@ module REXML # indentation will be twice this number of spaces, and children will be # indented an additional amount. For a value of 3, every item will be # indented 3 more levels, or 6 more spaces (2 * 3). Defaults to -1 - # transitive:: + # trans:: # If transitive is true and indent is >= 0, then the output will be # pretty-printed in such a way that the added whitespace does not affect # the absolute *value* of the document -- that is, it leaves the value @@ -171,14 +207,20 @@ module REXML # unable to parse proper XML, we have to provide a hack to generate XML # that IE's limited abilities can handle. This hack inserts a space # before the /> on empty tags. Defaults to false - def write( output=$stdout, indent=-1, transitive=false, ie_hack=false ) - output = Output.new( output, xml_decl.encoding ) if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output) - @children.each { |node| - indent( output, indent ) if node.node_type == :element - if node.write( output, indent, transitive, ie_hack ) - output << "\n" unless indent<0 or node == @children[-1] + def write( output=$stdout, indent=-1, trans=false, ie_hack=false ) + if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output) + output = Output.new( output, xml_decl.encoding ) + end + formatter = if indent > -1 + if transitive + REXML::Formatters::Transitive.new( indent, ie_hack ) + else + REXML::Formatters::Pretty.new( indent, ie_hack ) + end + else + REXML::Formatters::Default.new( ie_hack ) end - } + formatter.write( self, output ) end |