2007年1月8日月曜日

IronPythonとElementTreeモジュール

PythonでXMLやHTMLを使うのに便利なモジュールとしてElementTreeがあります。これをIronPythonから使えないかと考えて、いろいろと試してみました。結果は、予測通りでそのままでは使えませんでした。
このため、FePyプロジェクトのIPCE-r5に含まれているElementTreeを使ってみました。結果としては、

  1. XPathを使わなければIronPython1.0.1から使える。
  2. IPCE-r5で使えば、XPathも使える(findtext、findallなど)。
  3. DTDを使用していると環境によってセキュリティ例外がでる(IPCEとIronPythonとも)。
という感じでした。
 XPathの問題は何が原因かなと思ってソースコードを少々調べました。結果、IPCEの実装では、XmlReaderを使ってドキュメントを読み込んでいるのと、XPath式を分解するのに正規表現を使っているのを見つけました。XPath式を分解するための正規表現のパターンが、IronPython1.0.1では思った結果を返さないことが原因であると判明しました。
これはIPCEのreモジュールが、CPythonとの互換性を目指して修正されていることが原因でした。ということは、パターンをIronPython向けに移植すれば使えそうな感じです(ElementPath.pyのxpath_tokenizer)。
 セキュリティ例外の件は、XmlReader.CreateメソッドでXmlReaderのインスタンスを作成しているのですが、ここにXmlReaderSettings.ProhibitDtd=Falseを渡すことで回避できます(pyexpat.pyの_parseメソッド)。
 基本的に上記の問題以外は使えそうなのですが、IronPythonとIPCEも_codecsモジュールの実装上の問題があり、日本語を含むマルチバイト(正確にはASCII以外)の文字はXMLでエンコードを指定していても変換してくれません。このため、自分でencode()関数を使ってユニコードに変換する必要があります。
 これ以外にXMLをIronPythonで使うには、XmlDocumentを使う方法になります。さて、どうしたもんでしょうかねぇ。

0 件のコメント: