{"id":569,"date":"2009-07-26T14:15:32","date_gmt":"2009-07-26T23:15:32","guid":{"rendered":"https:\/\/www.kellyrob99.com\/blog\/?p=569"},"modified":"2009-08-10T21:28:43","modified_gmt":"2009-08-11T06:28:43","slug":"streamingmarkupbuilder-for-groovy-er-xml","status":"publish","type":"post","link":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/","title":{"rendered":"StreamingMarkupBuilder for Groovy-er xml"},"content":{"rendered":"<p>Been having an awful lot of fun lately playing with the Groovy <a href=\"http:\/\/groovy.codehaus.org\/Creating+XML+using+Groovy%27s+StreamingMarkupBuilder\">StreamingMarkupBuilder<\/a>. I&#8217;m not a big fan of xml in general, but it&#8217;s definitely got its uses(configuration and web service data interchange to name just a couple).<\/p>\n<p>StreamingMarkBuilder makes it really very painless to create complex xml structures without a whole lot of hassle. There are some excellent examples out there already, but I couldn&#8217;t find one offhand that put all the pieces together.<\/p>\n<p>This example demonstrates how to include the xml declaration, set the encoding, and incorporate namespaces. It also shows how to use iteration to create nodes in the Document. The (somewhat contrived) example code shows one possible way to template Facelet forms based on some simple parameters.<\/p>\n<pre class=\"brush: groovy; title: ; notranslate\" title=\"\">\r\nimport groovy.xml.StreamingMarkupBuilder\r\n\r\ndef inputs = &#x5B;'FirstName', 'LastName', 'Street', 'City', 'Country']\r\ndef controller = 'formController'\r\ndef bean = 'formBean'\r\n\r\ndef builder = new StreamingMarkupBuilder()\r\nbuilder.encoding = &quot;UTF-8&quot;\r\ndef doc = builder.bind {\r\n    mkp.xmlDeclaration()\r\n    mkp.declareNamespace(ui: &quot;http:\/\/java.sun.com\/jsf\/facelets&quot;,\r\n            h: &quot;http:\/\/java.sun.com\/jsf\/html&quot;)\r\n    'ui:composition'(template: '\/layout\/main.xhtml') {\r\n        'h:form'(id: &quot;${controller}_form&quot;) {\r\n            inputs.each {input -&gt;\r\n                def inputId = input.toLowerCase().replaceAll(' ', '')\r\n                'h:outputLabel'(input, id: inputId, styleClass: 'inputlabel')\r\n                'h:inputText'(id: &quot;${inputId}_input&quot;, value: &quot;${bean}_$inputId&quot;, styleClass: 'inputText')\r\n            }\r\n        }\r\n        'h:commandButton'(id: &quot;${controller}_submit&quot;, action: &quot;#{${controller}.submit}&quot;, styleClass: &quot;submitButton&quot;,\r\n                value: 'Submit')\r\n    }\r\n}\r\n<\/pre>\n<p>And the output looks like this.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;ui:composition xmlns:ui=&quot;http:\/\/java.sun.com\/jsf\/facelets&quot; template=&quot;\/layout\/main.xhtml&quot; xmlns:h=&quot;http:\/\/java.sun.com\/jsf\/html&quot;&gt;\r\n  &lt;h:form id=&quot;formController_form&quot;&gt;\r\n    &lt;h:outputLabel id=&quot;firstname&quot; styleClass=&quot;inputlabel&quot;&gt;FirstName&lt;\/h:outputLabel&gt;\r\n    &lt;h:inputText id=&quot;firstname_input&quot; value=&quot;formBean_firstname&quot; styleClass=&quot;inputText&quot;\/&gt;\r\n    &lt;h:outputLabel id=&quot;lastname&quot; styleClass=&quot;inputlabel&quot;&gt;LastName&lt;\/h:outputLabel&gt;\r\n    &lt;h:inputText id=&quot;lastname_input&quot; value=&quot;formBean_lastname&quot; styleClass=&quot;inputText&quot;\/&gt;\r\n    &lt;h:outputLabel id=&quot;street&quot; styleClass=&quot;inputlabel&quot;&gt;Street&lt;\/h:outputLabel&gt;\r\n    &lt;h:inputText id=&quot;street_input&quot; value=&quot;formBean_street&quot; styleClass=&quot;inputText&quot;\/&gt;\r\n    &lt;h:outputLabel id=&quot;city&quot; styleClass=&quot;inputlabel&quot;&gt;City&lt;\/h:outputLabel&gt;\r\n    &lt;h:inputText id=&quot;city_input&quot; value=&quot;formBean_city&quot; styleClass=&quot;inputText&quot;\/&gt;\r\n    &lt;h:outputLabel id=&quot;country&quot; styleClass=&quot;inputlabel&quot;&gt;Country&lt;\/h:outputLabel&gt;\r\n    &lt;h:inputText id=&quot;country_input&quot; value=&quot;formBean_country&quot; styleClass=&quot;inputText&quot;\/&gt;\r\n  &lt;\/h:form&gt;\r\n  &lt;h:commandButton id=&quot;formController_submit&quot; action=&quot;#{formController.submit}&quot; styleClass=&quot;submitButton&quot; value=&quot;Submit&quot;\/&gt;\r\n&lt;\/ui:composition&gt;\r\n<\/pre>\n<p>Normally StreamingMarkupBuilder output is devoid of whitespace but for readability I rendered it using the <a href=\"http:\/\/uncommentedbytes.blogspot.com\/2008\/09\/format-groovy-streamingmarkupbuilder.html\">very handy example provided here<\/a>. Big thank you to Jeff Sheets for sharing that code!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Been having an awful lot of fun lately playing with the Groovy StreamingMarkupBuilder. I&#8217;m not a big fan of xml in general, but it&#8217;s definitely got its uses(configuration and web service data interchange to name just a couple). StreamingMarkBuilder makes it really very painless to create complex xml structures without a whole lot of hassle. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[6],"tags":[76,257,258,35,109,74,110,111],"class_list":["post-569","post","type-post","status-publish","format-standard","hentry","category-dev","tag-facelets","tag-groovy","tag-java","tag-programming","tag-streamingmarkupbuilder","tag-xml","tag-xml-declaration","tag-xml-namespace"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"TheKaptain\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"The Kaptain on ... stuff | Tales of development, life and the folly that goes along with both\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff\" \/>\n\t\t<meta property=\"og:description\" content=\"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2009-07-26T23:15:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2009-08-11T06:28:43+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff\" \/>\n\t\t<meta name=\"twitter:description\" content=\"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#article\",\"name\":\"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff\",\"headline\":\"StreamingMarkupBuilder for Groovy-er xml\",\"author\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\"},\"datePublished\":\"2009-07-26T14:15:32-09:00\",\"dateModified\":\"2009-08-10T21:28:43-09:00\",\"inLanguage\":\"en-US\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#webpage\"},\"articleSection\":\"Development, Facelets, Groovy, Java, Programming, StreamingMarkupBuilder, XML, xml declaration, xml namespace\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"name\":\"Development\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"position\":2,\"name\":\"Development\",\"item\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#listItem\",\"name\":\"StreamingMarkupBuilder for Groovy-er xml\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#listItem\",\"position\":3,\"name\":\"StreamingMarkupBuilder for Groovy-er xml\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/category\\\/dev\\\/#listItem\",\"name\":\"Development\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\",\"name\":\"The Kaptain on ... stuff\",\"description\":\"Tales of development, life and the folly that goes along with both\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"TheKaptain\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e41f09f3548f065fe6967ac904d3ea2a638614c16d879cac47cfad64e5b1426a?s=96&d=monsterid&r=g\",\"width\":96,\"height\":96,\"caption\":\"TheKaptain\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/\",\"name\":\"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff\",\"description\":\"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/2009\\\/07\\\/26\\\/streamingmarkupbuilder-for-groovy-er-xml\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2009-07-26T14:15:32-09:00\",\"dateModified\":\"2009-08-10T21:28:43-09:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/\",\"name\":\"The Kaptain on ... stuff\",\"description\":\"Tales of development, life and the folly that goes along with both\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kellyrob99.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff","description":"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.","canonical_url":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#article","name":"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff","headline":"StreamingMarkupBuilder for Groovy-er xml","author":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#organization"},"datePublished":"2009-07-26T14:15:32-09:00","dateModified":"2009-08-10T21:28:43-09:00","inLanguage":"en-US","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#webpage"},"isPartOf":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#webpage"},"articleSection":"Development, Facelets, Groovy, Java, Programming, StreamingMarkupBuilder, XML, xml declaration, xml namespace"},{"@type":"BreadcrumbList","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.kellyrob99.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","name":"Development"}},{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","position":2,"name":"Development","item":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#listItem","name":"StreamingMarkupBuilder for Groovy-er xml"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#listItem","position":3,"name":"StreamingMarkupBuilder for Groovy-er xml","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/#listItem","name":"Development"}}]},{"@type":"Organization","@id":"https:\/\/www.kellyrob99.com\/blog\/#organization","name":"The Kaptain on ... stuff","description":"Tales of development, life and the folly that goes along with both","url":"https:\/\/www.kellyrob99.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author","url":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/","name":"TheKaptain","image":{"@type":"ImageObject","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/e41f09f3548f065fe6967ac904d3ea2a638614c16d879cac47cfad64e5b1426a?s=96&d=monsterid&r=g","width":96,"height":96,"caption":"TheKaptain"}},{"@type":"WebPage","@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#webpage","url":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/","name":"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff","description":"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/#breadcrumblist"},"author":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/www.kellyrob99.com\/blog\/author\/admin\/#author"},"datePublished":"2009-07-26T14:15:32-09:00","dateModified":"2009-08-10T21:28:43-09:00"},{"@type":"WebSite","@id":"https:\/\/www.kellyrob99.com\/blog\/#website","url":"https:\/\/www.kellyrob99.com\/blog\/","name":"The Kaptain on ... stuff","description":"Tales of development, life and the folly that goes along with both","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.kellyrob99.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"The Kaptain on ... stuff | Tales of development, life and the folly that goes along with both","og:type":"article","og:title":"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff","og:description":"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.","og:url":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/","article:published_time":"2009-07-26T23:15:32+00:00","article:modified_time":"2009-08-11T06:28:43+00:00","twitter:card":"summary","twitter:title":"StreamingMarkupBuilder for Groovy-er xml | The Kaptain on ... stuff","twitter:description":"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation."},"aioseo_meta_data":{"post_id":"569","title":"StreamingMarkupBuilder for Groovy-er xml | #site_title","description":"A simple example of how to create XML using StreamingMarkupBuilder and Groovy that covers the xml declaration, binding namespaces , setting the encoding, and iterating during the Document creation.","keywords":[{"label":"XML","value":"XML"},{"label":"Java","value":"Java"},{"label":"Groovy","value":"Groovy"},{"label":"StreamingMarkupBuilder","value":"StreamingMarkupBuilder"},{"label":"facelets","value":"facelets"},{"label":"xml declaration","value":"xml declaration"},{"label":"xml namespace","value":"xml namespace"},{"label":"programming","value":"programming"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-02-09 05:15:56","updated":"2025-11-29 20:24:45","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kellyrob99.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/\" title=\"Development\">Development<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tStreamingMarkupBuilder for Groovy-er xml\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kellyrob99.com\/blog"},{"label":"Development","link":"https:\/\/www.kellyrob99.com\/blog\/category\/dev\/"},{"label":"StreamingMarkupBuilder for Groovy-er xml","link":"https:\/\/www.kellyrob99.com\/blog\/2009\/07\/26\/streamingmarkupbuilder-for-groovy-er-xml\/"}],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/prjtg-9b","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/comments?post=569"}],"version-history":[{"count":19,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/569\/revisions"}],"predecessor-version":[{"id":607,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/posts\/569\/revisions\/607"}],"wp:attachment":[{"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/media?parent=569"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/categories?post=569"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kellyrob99.com\/blog\/wp-json\/wp\/v2\/tags?post=569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}