xmlで書かれた情報をScalaで抽出してDBに入れようとしたら、軽くハマったのでまとめ。
xmlから特定の要素を取り出すには、\演算子と\\演算子を使います。
コップ本やネットで言葉の説明を読んでもこの2つの演算子の違いがよくわからないので、自分で動かして試してみました。
\演算子
例えば下記のようなxmlに対して\演算子を使用すると、コメントのような出力になります。
val xml0=
<a>
<b>
<c>
</c>
</b>
</a>
println(xml0 \ "a") // 何も出力されない
println(xml0 \ "b") // <b><c></c></b>
println(xml0 \ "c") // 何も出力されない
ここから分かるのは、\演算子は一番外側の要素の子供に対してのみ有効な演算子であるということ。
一番外側の要素や、そこから2階層以上深い要素に対しては使うことができません。
なぜこういう仕様なのかは、XMLに詳しくないのでよくわかりません(XML操作は、通常子要素に対してのみ行うものなのでしょうか?)。
\\演算子
どのような深さの要素も抽出できるようにするには、\演算子ではなく、\\演算子を使います。
val xml0=
<a>
<b>
<c>
</c>
</b>
</a>
println(xml0 \ "a") // <a><b><c></c></b></a>
println(xml0 \ "b") // <b><c></c></b>
println(xml0 \ "c") // <c></c>
\演算子は何のために必要?
こう見ると、毎回\\演算子だけ使えば良いような気がするのですが、そういう単純な話ではないのでしょうか?
xml操作ってあまりする機会がないので何となく釈然としませんが、とりあえず当面の自分の目的は果たせそうです。