Index > XML文書から テキストノード text() を抜き出す方法
Wed, August 26, 2009

XML文書から テキストノード text() を抜き出す方法

googleのTranslate APIを使って、XML文書を日本語から英語に翻訳する ためには、まず、翻訳対象のXML文書中でテキストノードを取り出す必要がある。

単にテキストノードを取り出すだけならば、 XPath で指定した特定部分だけをXML文書から抜き出すスタイルシート のようにXSLTを使えば済む話だが、 その取り出したテキストを

  1. 日本語から英語に翻訳した上で
  2. 翻訳した英語テキストを元の場所に書き戻す必要がある

ので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 )

ポイント

テスト用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
不思議の国のアリス
うさぎの穴をまっさかさま
アリスは川辺でおねえさんのよこにすわって、なんにもすることがないのでとても退屈(たいくつ)しはじめていました。
 Twitter
follow me on Twitter
 Categories