我正在研究一个函数,如果文本节点是元素的唯一子节点,则目标是返回文本节点的文本。例如:
<root>1</root> => 1
<root><node>1</node></root> => null
显然 Scala 不区分只有文本的节点和带有元素的节点。
那么如何判断一个元素(或一般来说,一个节点)下面是否只有一个文本节点?
我正在研究一个函数,如果文本节点是元素的唯一子节点,则目标是返回文本节点的文本。例如:
<root>1</root> => 1
<root><node>1</node></root> => null
显然 Scala 不区分只有文本的节点和带有元素的节点。
那么如何判断一个元素(或一般来说,一个节点)下面是否只有一个文本节点?
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>))
但更多的scala方式是返回Option[String]
而不是String/null
:
def extractText(n: Node): Option[String] = n match {
case Elem(_, _, _, _, Seq(Text(t))) => Some(t)
case _ => None
}