テキストノードが要素の唯一の子である場合、テキストノードのテキストを返すことが目標です。例えば:
<root>1</root> => 1
<root><node>1</node></root> => null
どうやら Scala は、テキストのみの Node と要素を持つ Node を区別しません。
では、要素 (または一般的にはノード) の下にテキスト ノードしかないかどうかは、どうすればわかりますか?
テキストノードが要素の唯一の子である場合、テキストノードのテキストを返すことが目標です。例えば:
<root>1</root> => 1
<root><node>1</node></root> => null
どうやら Scala は、テキストのみの Node と要素を持つ Node を区別しません。
では、要素 (または一般的にはノード) の下にテキスト ノードしかないかどうかは、どうすればわかりますか?
Text
とElem
は両方ともXMLノードであるため、ノードのタイプを識別するisInstanceOf
には、たとえば次のようにします。
import scala.xml.{Text, Node}
def hasOnlyTextChild(node:Node) = node.child.size == 1 && node.child(0).isInstanceOf[Text]
パターンマッチングの力を利用できます。
import xml.{Text, Elem, Node}
def extractText(n: Node): String = n match {
case Elem(_, _, _, _, Seq(Text(t))) => t
case _ => null
}
println(extractText(<root>1</root>))
println(extractText(<root><node>1</node></root>))
Option[String]
しかし、より多くのスカラウェイは、代わりに戻ることですString/null
:
def extractText(n: Node): Option[String] = n match {
case Elem(_, _, _, _, Seq(Text(t))) => Some(t)
case _ => None
}