ContactXML でハマる

住所録ソフトとして筆まめを使っていると以前書きましたが、とてもよくできたソフトではあるものの、やはり不満な点もあり、データを MySQL に引っ越そうとしています。

そのためには、データを汎用的な形式で書き出す必要があるのですが、タブ区切りを選ぶと、年賀状などの出受の記録が失われてしまいます。(すべてのデータが書き出せない)
試しに ContactXML 形式を選択すると、それらしいデータが出力されているので、早速 PHP で読み込むためのスクリプトを作成することとしました。

まず始めに、ファイルが Shift_JIS なので UTF-8 に変換し、[cci_xml][/cci] と encoding を書き換えました。

後は [cci_php]simplexml_load_file()[/cci] を使って読み込むだけ、と思ったんですが、そう簡単にはいきませんでした。

ぱっと見は読み込めているように思えるのですが、内容を [cci_php]foreach[/cci] でなめていくと、よくわからないタイミングで、「Node no longer exists」というエラーが頻発します。

ネットで検索すると、「シリアライズをすると Node no longer exists が発生する」ということで、たとえば、JSON 形式に変換して、また元に戻すことにより、この問題を回避できる記述されています。(あるいは、[cci_php]get_object_vars()[/cci] を用いる方法。)

これら方法は SimpleXMLElement をただのオブジェクト、もしくは配列に置き換えることを意味し、その致命的な欠点として、[cci_php]SimpleXMLElement->attributes()[/cci] で取得できる属性情報が失われてしまうことがあげられます。
また、[cci_php]SimpleXMLElement->xpath()[/cci] による、XPath 式による検索ができなくなってしまいます。

と、ここまで書いて、もう一つの問題点が。
これは、恐らく PHP の問題ではないと思いますが、ContactXML を XPath 式を使って検索しようとしても、検索できません。Safari で [cci_JavaScript]document.evaluate()[/cci] しても同じで、exception も投げられないので、理由が分かりませんでした。
色々試した結論として、上手く検索できない XML ファイルには、[cci_xml][/cci] とごちゃごちゃ書いてあって、これを [cci_xml][/cci] に書き換えると何事もなかったかのように検索できるようになりました。

それと、PHP の問題だと思うんですけど、ISO 8601 日付が上手く parse されないという問題にも遭遇しています。

[cci_xml][/cci] という風に日付が整形されているので、これを読み込みたいんですが、期待通りの動きをしないのです。

[cc_php]

[/cc]

[cc]
2010-04-01T20:15:51+09:00

array(12) {
[“year”]=>
bool(false)
[“month”]=>
bool(false)
[“day”]=>
bool(false)
[“hour”]=>
bool(false)
[“minute”]=>
bool(false)
[“second”]=>
bool(false)
[“fraction”]=>
bool(false)
[“warning_count”]=>
int(0)
[“warnings”]=>
array(0) {
}
[“error_count”]=>
int(2)
[“errors”]=>
array(2) {
[0]=>
string(35) “The format separator does not match”
[1]=>
string(13) “Trailing data”
}
[“is_localtime”]=>
bool(false)
}
[/cc]

というわけで、前途多難であります。

にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしへ
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしに参加しています。 励みになりますので、足あとがわりに、ランクアップにご協力下さい。

Leave a Reply