住所録ソフトとして筆まめを使っていると以前書きましたが、とてもよくできたソフトではあるものの、やはり不満な点もあり、データを 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]
それと、PHP の問題だと思うんですけど、ISO 8601 日付が上手く parse されないという問題にも遭遇しています。
[cci_xml]
[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]
というわけで、前途多難であります。
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしに参加しています。 励みになりますので、足あとがわりに、ランクアップにご協力下さい。 |