Как декодировать данные базы 64 - PullRequest
1 голос
/ 25 декабря 2009

У меня есть XML-документ, в котором есть тег для изображения, подобного этому

если изображение есть, тег будет следующим:

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

А если изображения нет, то

<thumbnail/>

Я хочу получить изображение в кодировке base64 с использованием DOM-парсера и как обращаться с тегами, у которых нет изображения, например <thumbnail/>

В документе XML будет любое количество тегов.

Ответы [ 2 ]

2 голосов
/ 25 декабря 2009

Пакет COS имеет Base64Decoder . Кодек Apache Commons предлагает альтернативу . Также можно использовать sun.misc.BASE64Decoder, но это делает ваш код специфичным для Sun JDK.

1 голос
/ 25 декабря 2009

В качестве альтернативы кодированию DOM вы можете сделать это декларативно в таблице стилей XSLT.

XSLT не имеет встроенных функций для декодирования base64, но вы можете использовать функцию расширения Saxon xs: base64Binary-to-octet для потоковой передачи его в файл с помощью Java FileOutputStream в Таблица стилей XSLT:

 <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>
...