Question

Je dois trouver un moyen de trouver un moyen de trouver le hachage pour les données codées en base64 dans le noeud XML // Note / ressources / données , ou correspondre en quelque sorte sinon à la valeur de hachage dans le noeud // Note / content / fr note // @ en-media hachage

Voir ci-dessous pour le fichier XML complet

S'il vous plaît suggérer une façon de {obtenir |} correspondance en utilisant XSLT

4aaafc3e14314027bb1d89cf7d59a06c

{de | avec}

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

Ce fichier XML exemple a évidemment été parés par souci de concision / simplicité. La réelle peut contenir> 1 image par note, par conséquent, la nécessité d'obtenir / hash match.

Le fichier 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>

solution mise en oeuvre

Utilisation concept de la solution proposée par Jackem . La principale différence est que je ne pas créer ma propre classe Java (et en créant une dépendance supplémentaire). Je fais le traitement dans le XSLT, car il est assez droite en avant, consultait que dépendances externes qui viennent avec les bibliothèques Java de base.
La solution de Jackem est plus correct car il ne perd cependant pas le zéro dans certains hash, j'ai trouvé qu'il était beaucoup plus facile de prendre soin de cette aide d'ailleurs de base Li'l carriole.

<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. voir frères et soeurs question pour ma mise en œuvre de la conversion de base64-->image file


Cette question est une sous-question de une autre question que j'ai demandé précédemment .

Était-ce utile?

La solution

Pour votre question connexe à faire le décodage base64 en XSLT, vous avez a accepté une réponse qui utilise des extensions saxonnes et Java. Donc, je suppose que vous êtes OK avec l'aide de ceux-ci.

Dans ce cas, vous pouvez créer une extension en Java pour calculer la somme 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 votre XSLT 2.0 stylesheet que vous exécutez Saxon, vous pouvez simplement appeler cette extension. En supposant que vous avez déjà les données décodées base64 (par exemple de la fonction d'extension saxon:base64Binary-to-octets comme dans la réponse liée) à data variable:

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

Autres conseils

  • télécharger un décodeur base64 freeware comme celui-ci ou utiliser un code source à partir du web ce
  • Le fichier de sortie est some_file.gif, 268 octets, une icône de dossier
  • Générer la somme de contrôle MD5 de ce fichier en utilisant md5sum ou encore un code source à partir du Web

Sortie pour moi:

4aaafc3e14314027bb1d89cf7d59a06c

C'est ce que vous vouliez, non? Il sera difficile (sinon impossible, et si vous me demandez, certainement pas en vaut la peine) pour faire tout cela en XSLT, mais au moins vous avez maintenant obtenu les informations que ce hachage a été créée en utilisant MD5 sur le fichier GIF.

Le 4aaaf... est le MD5 des données binaires que vous obtenez lorsque vous décodez les données codées en base64. Je ne pense pas que vous avez un autre choix que de décoder le contenu de l'élément de <data> et l'exécuter à travers une mise en œuvre MD5, ce qui est évidemment en dehors du cadre d'une transformation XSL. On peut supposer que le résultat du XSLT sera traité par un autre code, qui permet d'extraire et de vérifier les images.

Qu'en est-ce (ajouter à votre classpath):

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top