문제

XML 노드에서 Base64 인코딩 된 데이터의 해시를 찾는 방법을 찾는 방법을 찾아야합니다. // 참고/자원/데이터, 또는 어떻게 든 노드의 해시 값과 일치 // note/content/en-note // en-media@hash

전체 XML 파일은 아래를 참조하십시오

{ace | match}의 방법을 제안하십시오. XSLT 사용

4aaafc3e14314027bb1d89cf7d59a06c

{| with}

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

이 샘플 XML 파일은 간단한/단순성을 위해 분명히 다듬어졌습니다. 실제에는 노트 당> 1 이미지가 포함될 수 있으므로 해시를 얻거나 일치시켜야합니다.

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>

구현 된 솔루션

제안 된 솔루션의 개념을 사용합니다 Jackem. 주요 차이점은 내 자신의 Java 클래스를 만드는 것을 피하고 추가 의존성을 만들지 않는다는 것입니다. 나는 XSLT 내에서 처리를한다. 참조 만 참조하십시오 기본 Java 라이브러리와 함께 제공되는 외부 의존성.
Jackem의 해결책입니다 더 정확합니다 일부 해시에서는 주요 제로를 잃지 않기 때문에 Li'l Basic Hackery를 사용하여 다른 곳을 돌보는 것이 훨씬 쉽다는 것을 알았습니다.

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

추신 참조 형제 질문 내 구현을 위해 base64-->image file 변환


이 질문은 하위 질문입니다 내가 이전에 물었던 또 다른 질문.

도움이 되었습니까?

해결책

XSLT에서 Base64 디코딩 수행에 대한 관련 질문은 답을 받아 들였다 Saxon 및 Java 확장을 사용합니다. 그래서 나는 당신이 그것들을 사용해도 괜찮다고 생각합니다.

이 경우 MD5 합계를 계산하기 위해 Java로 확장을 만들 수 있습니다.

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

Saxon과 함께 실행되는 XSLT 2.0 스타일 시트에서 해당 확장자를 호출 할 수 있습니다. 이미 Base64-Decoded 데이터가 있다고 가정합니다 (예 : Extension Function에서 saxon:base64Binary-to-octets 링크 된 답변에서와 같이) 변수 data:

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

다른 팁

  • 일부 프리웨어베이스 64 디코더를 다운로드하십시오 이 하나 또는 웹에서 일부 소스 코드를 사용하십시오.
  • 출력 파일은 some_file.gif, 268 바이트, 폴더 아이콘입니다.
  • 해당 파일의 MD5 체크섬을 생성합니다 MD5SUM 또는 웹에서 일부 소스 코드

나를위한 출력 :

4aaafc3e14314027bb1d89cf7d59a06c

그게 당신이 원했던 것입니까? XSLT 에서이 모든 작업을 수행하는 것은 까다로울 것입니다 (불가능하지는 않지만, 당신이 저에게 묻는 경우, 확실히 노력할 가치가 없음). 그러나 적어도 당신은 이제이 해시가 GIF 파일에서 MD5를 사용하여 작성된 정보를 얻었습니다.

그만큼 4aaaf... Base64- 인코딩 된 데이터를 해독 할 때 얻을 수있는 이진 데이터의 MD5입니다. 나는 당신이 선택의 여지가 없다고 생각하지만 내용을 해독 할 것입니다. <data> XSL 변환의 범위를 벗어난 MD5 구현을 통해 요소 및 실행하십시오. 아마도 XSLT의 결과는 이미지를 추출하고 확인할 수있는 다른 코드로 처리됩니다.

이건 어때 (추가 커먼즈 코데 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top