Index > 数値文字参照(Numeric Character Reference)をJDOMで使いたい
Wed, September 16, 2009

数値文字参照(Numeric Character Reference)をJDOMで使いたい

数値文字参照 を含んだXMLをJDOMで生成するにはどうすればいいのか?と思って調べてみたのだが、 そのまま数値文字参照をテキストとしてセットする方法がわからなかった。

以下のような代替案で対処したので、メモしておきます。

何が問題か ... &(アンパサンド)の問題

数値文字参照はたとえば、 No Break Space(non-breaking space,NBSP) であれば、以下のような表現になる。

 

コードの調べ方

どの文字がどういう数値文字参照かを調べるには、 http://www.unicode.org/charts/ を参照のこと。

ちなみに、No Break Space は Basic Latin に含まれています。

JDOMでXMLを生成するときに、この数値文字参照をテキストに含めるには、 以下のようなコードを書きたくなります。

org.jdom.Element e=new org.jdom.Element("para");
e.setText(" ");

しかし、これをすると、& が & に展開されてしまい、こちらが意図したように No Break Space 文字が 該当箇所にセットされません。

回避方法

今回の場合、 No Break Space 文字を &x#00A0; としてセットしたい理由は、キーボードからその文字を入力できない (やり方はあるかもしれないが知らない)からです。

Java+JDOMでXML生成しているなら以下のコードを書けば、この問題を回避できます。

char[] c={'\u00A0'};
String nbsp=new String(c);

org.jdom.Element e=new org.jdom.Element("para");
e.setText(nbsp); //  

Jython上で同じことするにはどうすればいいのか?

Java + JDOM ではこの方法で問題ないのですが、実際の仕事ではこの処理を Jython で書いていました。 Jython上で char をうまく表現できれば問題ないのですが、軽く手元資料を調べただけでは、方法がわかりませんでした。

結局時間がなかったので、以下のようなPureJavaのUnicodeクラスを書いて、対処しました。 (全く非効率でスマートさに欠けますが。)

package test;
public class Unicode {

    public static NBSP;
    static {
        char[] c = {'\u00A0'};
        NBSP     = new String(c);
    }

}

Jythonからは次のように使います。

import org.jdom as jdom
import test

e=jdom.Element("para")
e.setText( test.Unicode.NBSP )

groovy の場合

def nbsp = new String('\u00A0')
def e = new org.jdom.Element('para')
e.setText( nbsp )

とんでもなく簡単です。 (さすがにJavaのスーパーセットだけはある。)

 Twitter
follow me on Twitter
 Categories