Frage

Ich muss einen Weg finden, um einen Weg zu finden, um den Hash für die base64 -codierten Daten im XML -Knoten zu finden // Hinweis/Ressourcen/Daten, oder irgendwie ansonsten mit dem Hash -Wert im Knoten übereinstimmen // note/content/en-note // en-media@hash

Siehe unten für die vollständige XML -Datei

Bitte schlagen Sie einen Weg vor, {erhalten | Übereinstimmung} Verwenden von XSLT

4aaafc3e14314027bb1d89cf7d59a06c

{von | mit}

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

Diese Beispiel -XML -Datei wurde offensichtlich wegen Kürze/Einfachheit beschnitten. Der tatsächliche kann> 1 Bild pro Notiz enthalten, daher müssen Hashes erfasst/übereinstimmen.

Die XML -Datei:

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

Implementierte Lösung

Verwenden des Konzepts der Lösung durch vorgeschlagene von Jackem. Der Hauptunterschied besteht darin, dass ich es vermeide, meine eigene Java -Klasse zu erstellen (und eine zusätzliche Abhängigkeit zu erstellen). Ich mache die Verarbeitung innerhalb des XSLT, da sie einfach genug ist, Nur Referenzierung externe Abhängigkeiten, die mit den grundlegenden Java -Bibliotheken verbunden sind.
Jackems Lösung ist korrekter Da es in einigen Hashes nicht das führende Null verliert, stellte ich jedoch fest, dass es viel einfacher war, sich an anderer Stelle mit li'l grundlegender Hackery zu kümmern.

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

Ps siehe Geschwisterfrage für meine Umsetzung der base64-->image file Wandlung


Diese Frage ist eine Unterfristung von Eine andere Frage, die ich zuvor gestellt habe.

War es hilfreich?

Lösung

Für Ihre damit verbundene Frage zum Durchführen der Basis64 -Decodierung in XSLT haben Sie akzeptierte eine Antwort Das verwendet sächsische und java -Erweiterungen. Ich gehe davon aus, dass Sie mit diesen in Ordnung sind.

In diesem Fall können Sie eine Erweiterung in Java zum Berechnen der MD5 -Summe erstellen:

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);
    } 
}

Aus Ihrem XSLT 2.0 Stylesheet, das Sie mit Saxon ausführen, können Sie diese Erweiterung einfach aufrufen. Angenommen, Sie haben bereits die Base64-dekodierten Daten (z. B. aus der Erweiterungsfunktion saxon:base64Binary-to-octets wie in der verknüpften Antwort) in Variable data:

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

Andere Tipps

  • Laden Sie einige Freeware Base64 -Decoder so herunter Dieses hier Oder verwenden Sie dafür einen Quellcode aus dem Web
  • Die Ausgabedatei ist slow_file.gif, 268 Bytes, ein Ordnersymbol
  • Generieren Sie die MD5 -Prüfsumme dieser Datei mithilfe md5sum oder noch einmal ein Quellcode aus dem Web

Ausgabe für mich:

4aaafc3e14314027bb1d89cf7d59a06c

Das wolltest du, nicht wahr? Es wird schwierig sein (wenn auch nicht unmöglich, und wenn Sie mich fragen, haben Sie die Mühe definitiv nicht wert), dies alles in XSLT zu tun, aber zumindest haben Sie jetzt die Informationen, dass dieser Hash mit MD5 in der GIF -Datei erstellt wurde.

Das 4aaaf... Ist der MD5 der binären Daten, die Sie erhalten, wenn Sie die Base64-kodierten Daten dekodieren. Ich glaube nicht, dass Sie eine Wahl haben, als den Inhalt von zu dekodieren <data> Element und führen Sie es durch eine MD5 -Implementierung aus, die offensichtlich außerhalb des Rahmens einer XSL -Transformation liegt. Vermutlich wird das Ergebnis des XSLT von einem anderen Code verarbeitet, der die Bilder extrahieren und überprüfen kann.

Wie wäre es damit (hinzufügen Commons-codec zu deinem Klassenpfad):

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top