XmlSlurperで取得したノードをxmlとして出力する
google:XmlSlurperでノードを取得した場合、GPathResultというクラスのインスタンスが取得される。
google:NodeChildというインターフェイスを実装していることから分かるとおり、xmlのノードを表している。
取得したノードのxml構造を見たいときは以下のように出力してやるとかなりおかしな出力の仕方がされる。
test.xml
<users><user name="genzou"><family>yu</family><family>ki</family></user><user name="yasu"><family>megumi</family></user><user name="taro"><family>hanako</family><family>shinji</family></user></users>
test.groovy
#!/usr/bin/env groovyimport java.text.* def users = new XmlSlurper(false,false).parseText(new File( "test.xml" ).text) def user = users*.user println user[0]
genzou@genzou-desktop:~/$ ./test.groovy
yukimegumihanakoshinji
どうやらテキストノードを保持するすべての子ノードをたどり、GPathResult#text()メソッドを呼び出しているようだ。
この場合、以下のように記述するのが正しい。
test.groovy(新)
#!/usr/bin/env groovyimport java.text.* def users = new XmlSlurper(false,false).parseText(new File( "test.xml" ).text) def user = users*.user println groovy.xml.XmlUtil.serialize(user[0]).toString()
出力される情報は一行になっているため、必要があれば自分で綺麗に整形・インデントしなければならないが。
ディスカッション
コメント一覧
groovy.xml.XmlUtil の serialize を使うと簡単ですよ。
整形もしてくれますし。
> 3bch
コメントありがとうございます。
試してはみたのですが、
標準エラー出力に以下のようなメッセージが表示されてしまいました。
[Fatal Error] :2:67: The markup in the document following the root element must be well-formed.
エラー: 'The markup in the document following the root element must be well-formed.'
XmlUtil.serialize(users.user[0], System.out) だと大丈夫で、
XmlUtil.serialize(users*.user[0], System.out) だとダメでした。
XmlUtil.serialize(users*.user[0][0], System.out) でも動くので
GPathResult で * によすアクセスを利用するとリストで更にラップされてしまうのだと思います。
> 3bch
ありがとうございます。
問題が解決しました!ブログに反映しておきます。