はてな田中さん(@stanaka)がruby製の変換ツール書いてくれました。
独自項目が保存できるのでこちらを利用するのをお勧めします!
→https://gist.github.com/3263705
ruby 1.9.2-p290, 1.9.3-p194で使えました。使い方はこんな感じ。
→https://gist.github.com/3282820sed 's/encoding="shift-jis"/encoding="cp932"/' in.xml | idm2keepassx.rb >out.xml
以降は「XSLTでやってみたい!」という方向けのエントリ
Linux Desktopで業務を回そう計画の一環として、IDManagerをKeepassXへ移行する予定です。 アプリを変えるためにはデータ移行! ということで、IDManagerでエクスポートしたXMLを、KeepassXでインポートできるXMLに変換するXSLTを書きました。 XSLTヨクワカラナイのでいろいろ参考にさせてもらいました。 特に助かったのはここでした。改行置換はまるっと使わせてもらってます。 ⇒FAQ的なXSLTのサンプル ちゃんとXMLで出力するようにxsl:element使って書いたけど、すごく読みにくく。。 なんちゃってXMLで、HTMLっぽく書いてた時のほうが読みやすかったなぁ。 ※使用上の注意 IDManagerでエクスポートしたXMLのエンコーディング指定を書き換えないとうまく動かない場合があります!
before
<?xml version="1.0" encoding="shift-jis" standalone="yes"?><idmData>
after
<?xml version="1.0" encoding="CP932" standalone="yes"?><idmData>
本体はかなり長いので、つづきに書いておきます。
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="UTF-8" /> <xsl:template match="/"> <xsl:element name="database"> <xsl:apply-templates/> </xsl:element> </xsl:template> <!-- ignore element --> <xsl:template match="familyName" /> <xsl:template match="givenName" /> <xsl:template match="familyNamePhonetic" /> <xsl:template match="givenNamePhonetic" /> <xsl:template match="e-mail1" /> <xsl:template match="e-mail2" /> <xsl:template match="e-mail3" /> <xsl:template match="zip1" /> <xsl:template match="prefecture1" /> <xsl:template match="address1" /> <xsl:template match="zip2" /> <xsl:template match="prefecture2" /> <xsl:template match="address2" /> <xsl:template match="tel1" /> <xsl:template match="tel2" /> <xsl:template match="handlename1" /> <xsl:template match="handlename2" /> <xsl:template match="company" /> <xsl:template match="defaultAccountName" /> <xsl:template match="defaultPasswordName" /> <xsl:template match="defaultItem1Name" /> <xsl:template match="defaultItem2Name" /> <xsl:template match="pasteTypeList" /> <xsl:template match="pasteTypeItem" /> <xsl:template match="folder"> <xsl:element name="group"> <xsl:element name="title"> <xsl:value-of select="@name"/> </xsl:element> <xsl:element name="icon">48</xsl:element> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="item"> <xsl:element name="entry"> <xsl:element name="title"> <xsl:value-of select="@name"/> </xsl:element> <xsl:element name="username"> <xsl:value-of select="account"/> </xsl:element> <xsl:element name="password"> <xsl:value-of select="password"/> </xsl:element> <xsl:element name="url"> <xsl:value-of select="url"/> </xsl:element> <xsl:element name="comment"> <xsl:call-template name="replace-comment"> <xsl:with-param name="str" select="comment"/> </xsl:call-template> </xsl:element> <xsl:element name="icon">18</xsl:element> <xsl:element name="creation">2009-02-28T00:00:00</xsl:element> <xsl:element name="lastaccess">2009-02-28T00:00:00</xsl:element> <xsl:element name="lastmod">2009-02-28T00:00:00</xsl:element> <xsl:element name="expire">Never</xsl:element> </xsl:element> </xsl:template> <!-- newline replacement function --> <xsl:template name="replace-comment"><xsl:param name="str"/> <xsl:choose> <xsl:when test="contains($str,' ')"> <xsl:value-of select="substring-before($str,' ')"/><br/> <xsl:call-template name="replace-comment"> <xsl:with-param name="str" select="substring-after($str,' ')"/> </xsl:call-template> </xsl:when> <xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>