<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: pretty code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 17 May 2008 05:21:24 GMT</pubDate>
    <description>DZone Snippets: pretty code</description>
    <item>
      <title>Pretty Print XML using Ruby</title>
      <link>http://snippets.dzone.com/posts/show/4953</link>
      <description>This code makes the XML output look pretty.  I tried using the documentation from the REXML website to apply the method example doc.write($stdout,0), but I gave up, and instead wrote my own XML pretty-print method.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'rexml/document'&lt;br /&gt;include REXML&lt;br /&gt;&lt;br /&gt;  def pretty_print(parent_node, itab)&lt;br /&gt;    buffer = ''&lt;br /&gt;&lt;br /&gt;    parent_node.elements.each do |node|&lt;br /&gt;&lt;br /&gt;      buffer += ' ' * itab + "&lt;#{node.name}#{get_att_list(node)}"&lt;br /&gt;  &lt;br /&gt;      if node.to_a.length &gt; 0&lt;br /&gt;        buffer += "&gt;"&lt;br /&gt;        if node.text.nil?&lt;br /&gt;          buffer += "\n"&lt;br /&gt;          buffer += pretty_print(node,itab+2) &lt;br /&gt;          buffer += ' ' * itab + "&lt;/#{node.name}&gt;\n"&lt;br /&gt;        else&lt;br /&gt;          node_text = node.text.strip&lt;br /&gt;          if node_text != ''&lt;br /&gt;            buffer += node_text &lt;br /&gt;            buffer += "&lt;/#{node.name}&gt;\n"        &lt;br /&gt;          else&lt;br /&gt;            buffer += "\n" + pretty_print(node,itab+2) &lt;br /&gt;            buffer += ' ' * itab + "&lt;/#{node.name}&gt;\n"        &lt;br /&gt;          end&lt;br /&gt;        end&lt;br /&gt;      else&lt;br /&gt;        buffer += "/&gt;\n"&lt;br /&gt;      end&lt;br /&gt;      &lt;br /&gt;    end&lt;br /&gt;    buffer&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def get_att_list(node)&lt;br /&gt;    att_list = ''&lt;br /&gt;    node.attributes.each { |attribute, val| att_list += " #{attribute}='#{val}'" }&lt;br /&gt;    att_list&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def pretty_xml(doc)&lt;br /&gt;    buffer = ''&lt;br /&gt;    xml_declaration = doc.to_s.match('&lt;\?.*\?&gt;').to_s&lt;br /&gt;    buffer += "#{xml_declaration}\n" if not xml_declaration.nil?&lt;br /&gt;    xml_doctype = doc.to_s.match('&lt;\!.*\"&gt;').to_s&lt;br /&gt;    buffer += "#{xml_doctype}\n" if not xml_doctype.nil?&lt;br /&gt;    buffer += "&lt;#{doc.root.name}#{get_att_list(doc.root)}"&lt;br /&gt;    if doc.root.to_a.length &gt; 0&lt;br /&gt;      buffer +="&gt;\n#{pretty_print(doc.root,2)}&lt;/#{doc.root.name}&gt;"&lt;br /&gt;    else&lt;br /&gt;      buffer += "/&gt;\n"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;xml_data = "&lt;hi id='124'&gt;&lt;yo&gt;&lt;a id='1'/&gt;&lt;b/&gt;&lt;c/&gt;&lt;/yo&gt;&lt;sushi&gt;&lt;love&gt;Ruby&lt;/love&gt;&lt;/sushi&gt;&lt;/hi&gt;"&lt;br /&gt;doc = Document.new(xml_data)&lt;br /&gt;pretty_xml(doc)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;output&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;hi id='124'&gt;&lt;br /&gt;  &lt;yo&gt;&lt;br /&gt;    &lt;a id='1'/&gt;&lt;br /&gt;    &lt;b/&gt;&lt;br /&gt;    &lt;c/&gt;&lt;br /&gt;  &lt;/yo&gt;&lt;br /&gt;  &lt;sushi&gt;&lt;br /&gt;    &lt;love&gt;Ruby&lt;/love&gt;&lt;br /&gt;  &lt;/sushi&gt;&lt;br /&gt;&lt;/hi&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;*Update 7-Jan-08 1:51AM *&lt;br /&gt;Although I haven't tried running the following XSL code, this might actually have been a better solution to my problem. source: http://www.printk.net/~bds/indent.html&lt;br /&gt;&lt;br /&gt;*Pretty Print XML using XSLT*&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;&lt;br /&gt;  &lt;xsl:output method="xml" encoding="ISO-8859-1"/&gt;&lt;br /&gt;  &lt;xsl:param name="indent-increment" select="'   '"/&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;xsl:template name="newline"&gt;&lt;br /&gt;    &lt;xsl:text disable-output-escaping="yes"&gt;&lt;br /&gt;&lt;/xsl:text&gt;&lt;br /&gt;  &lt;/xsl:template&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;xsl:template match="comment() | processing-instruction()"&gt;&lt;br /&gt;    &lt;xsl:param name="indent" select="''"/&gt;&lt;br /&gt;    &lt;xsl:call-template name="newline"/&gt;    &lt;br /&gt;    &lt;xsl:value-of select="$indent"/&gt;&lt;br /&gt;    &lt;xsl:copy /&gt;&lt;br /&gt;  &lt;/xsl:template&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;xsl:template match="text()"&gt;&lt;br /&gt;    &lt;xsl:param name="indent" select="''"/&gt;&lt;br /&gt;    &lt;xsl:call-template name="newline"/&gt;    &lt;br /&gt;    &lt;xsl:value-of select="$indent"/&gt;&lt;br /&gt;    &lt;xsl:value-of select="normalize-space(.)"/&gt;&lt;br /&gt;  &lt;/xsl:template&gt;&lt;br /&gt;    &lt;br /&gt;  &lt;xsl:template match="text()[normalize-space(.)='']"/&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;xsl:template match="*"&gt;&lt;br /&gt;    &lt;xsl:param name="indent" select="''"/&gt;&lt;br /&gt;    &lt;xsl:call-template name="newline"/&gt;    &lt;br /&gt;    &lt;xsl:value-of select="$indent"/&gt;&lt;br /&gt;      &lt;xsl:choose&gt;&lt;br /&gt;       &lt;xsl:when test="count(child::*) &gt; 0"&gt;&lt;br /&gt;        &lt;xsl:copy&gt;&lt;br /&gt;         &lt;xsl:copy-of select="@*"/&gt;&lt;br /&gt;         &lt;xsl:apply-templates select="*|text()"&gt;&lt;br /&gt;           &lt;xsl:with-param name="indent" select="concat ($indent, $indent-increment)"/&gt;&lt;br /&gt;         &lt;/xsl:apply-templates&gt;&lt;br /&gt;         &lt;xsl:call-template name="newline"/&gt;&lt;br /&gt;         &lt;xsl:value-of select="$indent"/&gt;&lt;br /&gt;        &lt;/xsl:copy&gt;&lt;br /&gt;       &lt;/xsl:when&gt;       &lt;br /&gt;       &lt;xsl:otherwise&gt;&lt;br /&gt;        &lt;xsl:copy-of select="."/&gt;&lt;br /&gt;       &lt;/xsl:otherwise&gt;&lt;br /&gt;     &lt;/xsl:choose&gt;&lt;br /&gt;  &lt;/xsl:template&gt;    &lt;br /&gt;&lt;/xsl:stylesheet&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 07 Jan 2008 01:41:26 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4953</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>XMLPrettyPrint: simple xml pretty print in perl</title>
      <link>http://snippets.dzone.com/posts/show/929</link>
      <description>&lt;code&gt;&lt;br /&gt;### begin_: file metadata&lt;br /&gt;    ### &lt;region-file_info&gt;&lt;br /&gt;    ### main:&lt;br /&gt;    ###   - name    : XMLPrettyPrint: simple xml pretty print in perl&lt;br /&gt;    ###     desc    : use perl with XML::Twig library to print indented xml&lt;br /&gt;    ###     date    : created="Thu 2005-12-01 11:08:15"&lt;br /&gt;    ###     last    : lastmod="Thu 2005-12-01 11:22:34"&lt;br /&gt;    ###     lang    : perl&lt;br /&gt;    ###     tags    : perl xml indent formatted pretty string cfPrettyPrint&lt;br /&gt;    ### &lt;/region-file_info&gt;&lt;br /&gt;&lt;br /&gt;### begin_: init perl&lt;br /&gt;    use strict;&lt;br /&gt;    use warnings;&lt;br /&gt;    use XML::Twig;&lt;br /&gt;&lt;br /&gt;### begin_: init vars&lt;br /&gt;    my  $sXML  = join "", (&lt;DATA&gt;);&lt;br /&gt;&lt;br /&gt;    ### init params&lt;br /&gt;    my  $params = [qw(none nsgmls nice indented record record_c)];&lt;br /&gt;    my  $sPrettyFormat  = $params-&gt;[3] || 'none';&lt;br /&gt;&lt;br /&gt;### begin_: process&lt;br /&gt;    my  $twig= new XML::Twig;&lt;br /&gt;    $twig-&gt;set_indent(" "x4);&lt;br /&gt;    $twig-&gt;parse( $sXML );&lt;br /&gt;    $twig-&gt;set_pretty_print( $sPrettyFormat );&lt;br /&gt;    $sXML      = $twig-&gt;sprint;&lt;br /&gt;&lt;br /&gt;### begin_: output&lt;br /&gt;    print $sXML;&lt;br /&gt;&lt;br /&gt;### begin_: sample data&lt;br /&gt;    1;&lt;br /&gt;    __END__&lt;br /&gt;&lt;table&gt;&lt;tr age="35" &gt;&lt;br /&gt;&lt;fname&gt;Homer&lt;/fname&gt;&lt;br /&gt;&lt;lname&gt;Simpson&lt;/lname&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr age="33" &gt;&lt;br /&gt;&lt;fname&gt;Barney&lt;/fname&gt;&lt;br /&gt;&lt;lname&gt;Rubble&lt;/lname&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr age="29" &gt;&lt;br /&gt;&lt;fname&gt;Betty&lt;/fname&gt;&lt;br /&gt;&lt;lname&gt;Rubble&lt;/lname&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 02 Dec 2005 06:23:55 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/929</guid>
      <author>drefty (drefty)</author>
    </item>
  </channel>
</rss>
