このため、FePyプロジェクトのIPCE-r5に含まれているElementTreeを使ってみました。結果としては、
- XPathを使わなければIronPython1.0.1から使える。
- IPCE-r5で使えば、XPathも使える(findtext、findallなど)。
- 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 件のコメント:
コメントを投稿