Evernote导出格式(ENEX)转换为HTML,包括图片?

9

@已解决

我创建的两个子问题已经得到解决(拆分这个问题太好了!),所以这个问题已经解决。我将把勾选标记授予samjudson,因为他的答案最接近。但是,对于实际的工作解决方案,请参见下面的子问题;包括我的实现解决方案和已勾选的答案。

@已弃用

由于这是一个相当复杂的问题,我将其拆分为两个单独的问题。仍然欢迎回答。

子问题如下:

  1. XSLT:将base64数据转换为图像文件
  2. XSLT:获取或匹配base64编码数据的哈希值

你好,想知道这里是否有人成功将Evernote的导出格式(即XML)转换为包含图片的HTML。我知道Evernote有一个导出为HTML的功能可以实现这一点,但最终我想要更多的花哨效果。

我已经使用以下XSLT成功获取了文本:

示例代码已删除

请参见子问题中的实现解决方案。

然而,目前这仅仅忽略了任何图片,这就是我需要帮助的地方。

障碍#1:Evernote将其图片存储为GIF或PNG,并在导出时直接将这些GIF和PNG嵌入XML中,使用的似乎是base64编码(我可能错了)。我需要能够重建这些图片。如果您在文本编辑器中打开文件,请查找**//note/resource/data**中的大块数据。例如(手动添加缩进):

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

障碍#2: Evernote将每张图片的文件名存储在资源节点下的以下路径中:
**//note/resource/resource-attributes/file-name**
然而,在实际引用图片的笔记中,它不是通过文件名引用图片,而是通过其哈希值引用,例如:

<en-media hash="4aaafc3e14314027bb1d89cf7d59a06c" type="image/gif" border="0" width="16" height="16" alt="Alt Text"/>

有人能解释一下如何处理XML中的(base64)编码二进制数据吗?

编辑

我从评论和答案中了解到,普通的XSLT无法处理图像。我使用的XSLT处理器是Xalan,但如果它不能很好地处理图像或base64,则请建议一个可以处理这些的处理器!

此外,根据要求,这是一个Evernote导出文件的样本。上面的代码片段仅是其选定部分。我已将其简化,仅包含一个笔记,并将大部分文本编辑掉,并添加缩进以提高清晰度。

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

这需要转换为:

<html>
    <body>
        <p>Some text here (followed by the picture)
        <p><img src="clip_image001.gif" border="0" width="16" height="16" alt="A picture"/></p>
        <p>Some more text here (preceded by the picture)
    </body>
</html>

文件clip_image001.gif已生成并保存。


顺便说一句 - 完全没有必要写 <xsl:element name="tr">,只需写 <tr>。此外,不要写 <xsl:attribute name="{'bgcolor'}">,而是写 <td bgcolor="#AADDFF">。这样你的样式表会更短。除非您发布一些示例 XML,否则很难提供帮助。同时发布您所在的环境也很有帮助,因为纯 XSLT 不支持 Base64 编码字符串。 - Tomalak
嗨Tomolak,感谢您的建议。我愿意听取使用哪个XSLT处理器的建议。我还在原问题的编辑中发布了一个样本XML文件。 - bguiz
3个回答

3
有一个新的数据URI规范http://en.wikipedia.org/wiki/Data_URI_scheme,如果你只想支持现代浏览器,并且你的图像很小(例如IE8仅支持<32k图像),那么这可能会有所帮助。

除此之外,你唯一能做的就是使用一些外部脚本将图像数据导出到文件并使用它们。这将大大取决于你使用的XSLT处理器。


嗨Sam,感谢你的建议。然而,我的Evernote文件主要是一些各种网站的注释剪辑,并且它们包含大于32k的图像,所以我不认为数据URI方案对此有帮助(尽管看起来非常相似)。 请建议你会使用哪个XSLT处理器和外部脚本,因为我在环境上很灵活。 - bguiz
个人而言,我会使用C#进行处理,因为我是一名.Net开发人员,但您也可以使用Java(在这种情况下,几乎有无限的XSLT处理器 - Saxon是最好的)。然而,每个处理器都有自己实现扩展方法的方式。 - samjudson

1
我刚刚写了一个新的Python脚本,可以将.enex文件转换为包括图片/附件等在内的.html文件。这个脚本还不完美,但至少是一个很好的开始。

https://github.com/eirikora/enex2html

下载、尝试并贡献吧!
最好的祝福, Eirik Y. Øra

根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community
虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接作为参考。仅有链接的答案如果链接页面发生变化,就可能失效。- 来自评论 - Ram Chander

0

是的,我以前遇到过那个网站,不幸的是,它使用base64来编码字符串(而不是像图像那样的二进制数据)。此外,我需要一种实际生成图像(写入文件)的方法。 - bguiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接