Pregunta

Necesito encontrar una manera de encontrar una manera de encontrar el hash de los datos con codificación base64 en el nodo XML //nota/de recursos/de los datos, o de alguna manera, de lo contrario el partido que el valor de hash en el nodo //nota/contenido/en-nota//es-media@hash

Vea a continuación para el completo archivo XML

Por favor, sugiera una manera para {obtener|partido} el uso de XSLT

4aaafc3e14314027bb1d89cf7d59a06c

{de|con}

R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw==

Este archivo XML de muestra, evidentemente, ha sido recortadas, por razones de brevedad y simplicidad.La real puede contener > 1 imagen por nota, por lo tanto, la necesidad de obtener y coinciden con los hashes.

El archivo XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export.dtd">
<en-export export-date="20091029T063411Z" application="Evernote/Windows" version="3.0">

<note>
    <title>A title here</title>
    <content><![CDATA[
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd">
        <en-note bgcolor="#FFFFFF">
            <p>Some text here (followed by the picture)
            <p><en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="A picture"/></p>
            <p>Some more text here (preceded by the picture)
        </en-note>
    ]]></content>
    <created>20090925T063154Z</created>
    <note-attributes>
        <author/>
    </note-attributes>
    <resource>
        <data encoding="base64">
R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw==
        </data>
        <mime>image/gif</mime>
        <resource-attributes>
            <file-name>clip_image001.gif</file-name>
        </resource-attributes>
    </resource>
</note>

</en-export>

Solución implementada

Utilizando el concepto de la solución sugerida por Jackem.La principal diferencia es que yo de evitar la creación de mi propia clase de Java (y la creación de un extra de dependencia).Yo hago el procesamiento dentro de la XSLT, ya que es sencillo lo suficiente, sólo de referencia dependencias externas que vienen con el básico de bibliotecas de Java.
Jackem la solución es más correcto porque no pierde el cero en algunos hash, sin embargo me pareció que era mucho más fáciles de cuidar de este en cualquier lugar utilizando li'l básicas de trucos.

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    ...
    xmlns:md5="java.security.MessageDigest"
    xmlns:bigint="java.math.BigInteger"
    exclude-result-prefixes="md5 bigint">
...
<xsl:for-each select="resource">
    <xsl:variable name="md5inst" select="md5:getInstance('MD5')" />
    <xsl:value-of select="md5:update($md5inst, $b64bin)" />
    <xsl:variable name="imgmd5bytes" select="md5:digest($md5inst)" />
    <xsl:variable name="imgmd5bigint" select="bigint:new(1, $imgmd5bytes)" />
    <xsl:variable name="imgmd5str" select="bigint:toString($imgmd5bigint, 16)" />
    <!-- NOTE: $imgmd5str loses the leading zero from imgmd5bytes (if there is one) -->
</xsl:for-each>
...

P. S.ver hermano pregunta para mi la implementación de la base64-->image file la conversión


Esta pregunta es una de subquestion otra pregunta que he planteado anteriormente.

¿Fue útil?

Solución

Para su pregunta relacionada acerca de hacer la decodificación base 64 en XSLT, tiene aceptó una respuesta que utiliza las extensiones sajones y Java. Así que supongo que están bien con el uso de ellos.

En ese caso, puede crear una extensión en Java para el cálculo de la suma MD5:

package com.stackoverflow.q1684963;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Sum {
    public static String calc(byte[] data) throws NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] digest = md5.digest(data);
        BigInteger digestValue = new BigInteger(1, digest);
        return String.format("%032x", digestValue);
    } 
}

A partir de su hoja de estilo XSLT 2.0 que se ejecuta con Saxon, a continuación, sólo se puede llamar a esa extensión. Asumiendo que ya tiene los datos decodificados base64 (por ejemplo, de saxon:base64Binary-to-octets función de extensión como en la respuesta ligado) en data variables:

<xsl:value-of xmlns:md5sum="com.stackoverflow.q1684963.MD5Sum"
              select="md5sum:calc($data)"/>

Otros consejos

  • Descargar algún programa gratuito Base64 decodificador como este o usar algún código fuente de la web para que este
  • Archivo de salida es some_file.gif, 268 bytes, un icono de carpeta
  • Generar la suma de comprobación MD5 del archivo utilizando md5sum o nuevamente el código fuente de la web

Salida para mí:

4aaafc3e14314027bb1d89cf7d59a06c

Eso es lo que querías, ¿no?Va a ser difícil (si no imposible, y si me preguntan a mí, definitivamente no vale la pena el esfuerzo) para hacer todo esto en XSLT, pero al menos ahora tenemos la información de que este hash se creó usando MD5 del archivo GIF.

El 4aaaf... es el MD5 de los datos binarios que se obtiene al decodificar los datos codificados en base64. No creo que usted tiene más remedio que decodificar el contenido del elemento <data> y ejecutarlo a través de una aplicación MD5, que es, obviamente, fuera del alcance de una transformación XSL. Presumiblemente, el resultado de la XSLT será procesada por algún otro código, que puede extraer y verificar las imágenes.

¿Qué tal esto (añadir commons-codec a la ruta de clases):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:digest="org.apache.commons.codec.digest.DigestUtils">
  [...]
  <xsl:value-of select="digest:md5Hex('hello, world!')"/>
</xsl:stylesheet>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top