In a prior example we showed how to read a sitemap with XMLSlurper and the snippets below will focus on how to create a sitemap using MarkupBuilder and StreamingMarkupBuilder . A sitemap allows users and crawlers the ability to identify accessible webpages within a website. The setup will define a groovy class named MyUrls
that will hold attributes for creating the sitemap.
Setup class MyUrls {
def loc
def lastmod
def changefreq
def priority
}
Create with MarkupBuilder @Test
public void create_sitemap_markupbuilder () {
def writer = new StringWriter ()
def builder = new groovy . xml . MarkupBuilder ( writer )
def myUrls = [ new MyUrls ( changefreq: "weekly" , loc: "http://www.leveluplunch.com/groovy/examples/" , lastmod: "2014-07-22T11:46:18-05:00" , priority: "0.8" ),
new MyUrls ( changefreq: "weekly" , loc: "http://www.leveluplunch.com/java/examples/" , lastmod: "2014-07-22T11:46:18-05:00" , priority: "0.8" )]
builder . urlset {
myUrls . each () { obj ->
url () {
changefreq ( obj . changefreq )
loc ( obj . loc )
lastmod ( obj . lastmod )
priority ( obj . priority )
}
}
}
println writer . toString ()
}
Output
<urlset>
<url>
<changefreq> weekly</changefreq>
<loc> http://www.leveluplunch.com/groovy/examples/</loc>
<lastmod> 2014-07-22T11:46:18-05:00</lastmod>
<priority> 0.8</priority>
</url>
<url>
<changefreq> weekly</changefreq>
<loc> http://www.leveluplunch.com/java/examples/</loc>
<lastmod> 2014-07-22T11:46:18-05:00</lastmod>
<priority> 0.8</priority>
</url>
</urlset>
Create with StreamingMarkupBuilder If you need to take it a step further and add a prefix with namespace StreamingMarkupBuilder provides this option. I didn't realize when first adding elements to declareNamespace
it prefixes "xmlns" to your key which resulted in Attribute name "xmlns:xmlns" associated with an element type "urlset" must be followed by the ' = ' character. Finally calling XmlUtil.serialize()
will serialize the xml to a string.
@Test
public void create_sitemap_streamingmarkupbuilder () {
def myUrls = [ new MyUrls ( changefreq: "weekly" , loc: "http://www.leveluplunch.com/blog/2014/09/29/amazon-cloudfront-s3-subfolders-default-index/" , lastmod: "2014-07-22T11:46:18-05:00" , priority: "0.8" ),
new MyUrls ( changefreq: "weekly" , loc: "http://www.leveluplunch.com/blog/2013/12/30/convert-recorded-audio-text-using-osx-dictation-audacity-soundflower/" , lastmod: "2014-07-22T11:46:18-05:00" , priority: "0.8" )]
def builder = new groovy . xml . StreamingMarkupBuilder ()
builder . encoding = 'UTF-8'
def mySitemap = builder . bind {
mkp . xmlDeclaration ()
mkp . declareNamespace (
"xsi " : "http://www.w3.org/2001/XMLSchema-instance" ,
"schemaLocation" : "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" ,
"" : "http://www.sitemaps.org/schemas/sitemap/0.9" )
urlset () {
myUrls . each () { obj ->
url () {
changefreq ( obj . changefreq )
loc ( obj . loc )
lastmod ( obj . lastmod )
priority ( obj . priority )
}
}
}
}
println XmlUtil . serialize ( mySitemap )
}
Output
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns:schemaLocation= "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns= "http://www.sitemaps.org/schemas/sitemap/0.9" >
<url>
<changefreq> weekly</changefreq>
<loc> http://www.leveluplunch.com/blog/2014/09/29/amazon-cloudfront-s3-subfolders-default-index/</loc>
<lastmod> 2014-07-22T11:46:18-05:00</lastmod>
<priority> 0.8</priority>
</url>
<url>
<changefreq> weekly</changefreq>
<loc> http://www.leveluplunch.com/blog/2013/12/30/convert-recorded-audio-text-using-osx-dictation-audacity-soundflower/</loc>
<lastmod> 2014-07-22T11:46:18-05:00</lastmod>
<priority> 0.8</priority>
</url>
</urlset>
Create sitemap with MarkupBuilder posted by Justin Musgrove on 03 November 2014
Tagged: groovy and groovy-xml
Share on: Facebook Google+
All the code on this page is available on github:
CreateSitemapMarkUpBuilder.groovy