views:

573

answers:

2

I have an XML doucment in which there is an tag for image like this

if there is an image then the tag would be as follows

<thumbnail>
<type>IMAGE JPG</type>
<data> base64 data </data>
</thumbnail>

And if there is no image then

<thumbnail/>

I want to get the base64 encoded image using DOM parser and how to handle tags which don't have any image like <thumbnail/>

In the XML document there will be any number of tags.

+2  A: 

The COS package has a Base64Decoder. Apache Commons Codec offers an alternative.

Brian Agnew
A: 

As an alternative to DOM coding, you could do it declaratively in an XSLT stylesheet.

XSLT does not have any built-in features to base64 decode, but you can use the Saxon extension function xs:base64Binary-to-octet to stream it out to a file using the Java FileOutputStream in an XSLT stylesheet:

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:saxon="http://saxon.sf.net/"
    xmlns:fos="java.io.FileOutputStream">

    <xsl:template match="/">
     <!--Your example did not reveal the document structure.
     Assuming thumbnail elements are children of the document element-->
  <xsl:apply-templates select="*/thumbnail" />
    </xsl:template>

    <!--For thumbnail elements that contain data, decode the BASE64 encoded content and write to file -->
    <xsl:template match="thumbnail[data]">
       <xsl:variable name="img" select="concat('c:\test\', position(), '.jpg')"/>
       <xsl:variable name="fos" select="fos:new(string($img))"/>
       <xsl:value-of select="fos:write($fos,saxon:base64Binary-to-octets(xs:base64Binary(data/text())))"/>
       <xsl:value-of select="fos:close($fos)"/>
    </xsl:template>

 <!--Do nothing with empty thumbnail elements-->
 <xsl:template match="thumbnail" />

</xsl:stylesheet>
Mads Hansen