Wed, August 26, 2009
XML文書から テキストノード text() を抜き出す方法
googleのTranslate APIを使って、XML文書を日本語から英語に翻訳する ためには、まず、翻訳対象のXML文書中でテキストノードを取り出す必要がある。
単にテキストノードを取り出すだけならば、 XPath で指定した特定部分だけをXML文書から抜き出すスタイルシート のようにXSLTを使えば済む話だが、 その取り出したテキストを
- 日本語から英語に翻訳した上で
- 翻訳した英語テキストを元の場所に書き戻す必要がある
のでXSLTだけでは厳しい。
そこで、例によってJDOMとJythonを使って、問題を解決する。
コード
import java
import org.jdom as jdom
class TextNodeFilter(jdom.filter.Filter):
def matches(self,obj) :
if java.lang.String( str(obj.getClass()) ).indexOf('org.jdom.Text')!=-1 :
return True
else :
return False
TEXT_NODE_FILTER=TextNodeFilter()
def parse( ele ):
list=ele.getContent(TEXT_NODE_FILTER)
for textObj in list :
if len(java.lang.String(textObj.text).trim())>0 :
java.lang.System.out.println( textObj.text )
for e in ele.children :
parse( e )
f=java.io.File('sample.xml')
doc=jdom.input.SAXBuilder().build(f)
parse( doc.rootElement )
ポイント
- parseメソッドを使って、XML文書中のすべての要素をチェック
- parseメソッド内で、ele.getContent(TEXT_NODE_FILTER) にて、text() に該当するオブジェクトを取得
テスト用XML文書
<?xml version="1.0" encoding="UTF-8" ?>
<book>
<chapter>
<title>不思議の国のアリス</title>
<sect1>
<title>うさぎの穴をまっさかさま</title>
<para>アリスは川辺でおねえさんのよこにすわって、なんにもすることがないのでとても退屈(たいくつ)しはじめていました。</para>
</sect1>
</chapter>
</book>
実行結果
$ export CLASSPATH=jdom.jar ; jython print-text.py
不思議の国のアリス
うさぎの穴をまっさかさま
アリスは川辺でおねえさんのよこにすわって、なんにもすることがないのでとても退屈(たいくつ)しはじめていました。