Siena. です。

▼ [ruby-list:35186] < "NAKAMURA, Hiroshi" さん

# [ruby-list:35143] は、なひさんの意図を
# 読み取れてないコメントでごめんなさいです

》>   * REXMLは日本語処理に問題がある>     Uconv,Iconvを必要とすること以上に?

えーと、こっちの件だけです。もひとつの方は、良く分かってませんので。

》1点目についてですが、XML文書を解析することを考えた場合(*)、Uconv or Iconvを必要とすること以上には問題はありません。

条件付きで御意。
後述しますが、少しケアしないといけないような気がします。

》(*) ここで「解析することを考えた場合」と書いてますが、それ以外のXPathやwriterについて、自信がないためです。

あたしは、XPath では ASCII な識別子しか使ってませんし、
#write は UTF-8 でまとめて書き出してから変換しているので、
問題があるか分かりませんです m(.. )m

》問題があるとすれば、REXMLが最近力を入れている「ストリーミングもできるぜ」という機能について、残念ながらその恩恵にあずかることができなさそう、ということです。ですがこの問題については、現状で問題視しているのはなひだけなので、無視していいと思います。

あたしの場合は、問題視していないというよりは諦めている ^^;
というのが現状です。まず、使えるようになるのが先決、という事で。

XML そのものの設計思想に、全部読まなくても逐次パース可能、
というのがあったと思うのですが、ネットワークサービスで反応速度を
稼ぐためには、転送しながら処理できる必要があると思っています。
今はともかく、先のことを考えるとあまり無視したくはありませんね。
SOAP なんかだと、結構影響しそうですもの。

》# 妥協案として、REXML::Sourceを継承して# SourceConvertCESForEachLineとかいうクラスを作り、# 改行まで読み込んで一行ずつ変換して解析、# とするのかなぁ。なんかかっこ悪い。。。

現バージョンに依存してしまうかもしれませんが、
REXML::Source, REXML::SourceIO では @source.readline( '>' )
でバッファを読んできているようですね。
@source が、readline でエンコーディングを変換しながら返すような
オブジェクトなら、REXML::Source をいじらないでも良いかもです。
という事で [ruby-list:35186] の末尾の質問となったわけでした。

ただ、そうすると XML 宣言の encoding 指定と実際の
エンコーディングが一致しないとかいう問題 (*) が出てしまうので、
その辺りもケアするようになっていないと、破綻するかもしれません。
REXML::Source で、未知のエンコーディングなら UTF-8 として
扱うようになっていると、現時点では結果的には整合しますし、
ちょっと見た範囲だと、そうなっているように見えます。
読み間違えていないか自信ないですし、そうする事を意図して
書かれているのか知りませんので、断言できませんけれど。
また、REXML 今後対応するエンコーディングが増えた時に、不整合の
たねになります。 # M17N を待つというスタンスのようですが

(*) XML 仕様的にエラー扱いで、結果は処理系依存で未定義

という事をまじめに考えると、@source で、XML 宣言を
置き換えて返すようにするか、XML 宣言の直後を
ストリームの先頭とするか、なんとかしないとならなそうで...

Source を継承して、という話に戻ると、あちこちで REXML::Source
クラスを直接参照しているので、これをパラメータ化してもらうか、
REXML::Source を直接上書き定義するようにしないといけないのですよね。
多分、#write のために、REXML::Output も同様かと。

---
Siena. <mailto:siena / cr.chiba-u.ac.jp>