xml03syntax.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 99 行
SCALA
99 行
import scala.testing.SUnit._import scala.xml._object Test extends AnyRef with Assert { private def handle[A](x: Node): A = { println(x) x.child(0).asInstanceOf[Atom[A]].data } def main(args: Array[String]) { test1 test2 test3 } private def test1 { val xNull = <hello>{null}</hello> // these used to be Atom(unit), changed to empty children assertSameElements(xNull.child, Nil) val x0 = <hello>{}</hello> // these used to be Atom(unit), changed to empty children val x00 = <hello>{ }</hello> // dto. val xa = <hello>{ "world" }</hello> assertSameElements(x0.child, Nil) assertSameElements(x00.child, Nil) assertEquals(handle[String](xa), "world") val xb = <hello>{ 1.5 }</hello> assertEquals(handle[Double](xb), 1.5) val xc = <hello>{ 5 }</hello> assertEquals(handle[Int](xc), 5) val xd = <hello>{ true }</hello> assertEquals(handle[Boolean](xd), true) val xe = <hello>{ 5:short }</hello> assertEquals(handle[Short](xe), 5:short) val xf = <hello>{ val x = 27; x }</hello> assertEquals(handle[Int](xf), 27) val xg = <hello>{ List(1,2,3,4) }</hello> println(xg) for (z <- xg.child) { println(z.toString() + {if (z.isInstanceOf[Text]) "(is text node ' ')" else ""}) } val xh = <hello>{ for(x <- List(1,2,3,4) if x % 2 == 0) yield x }</hello> println(xh) for (z <- xh.child) { println(z.toString() + {if (z.isInstanceOf[Text]) "(is text node ' ')" else ""}) } println } /** see SVN r13821 (emir): support for <elem key={x:Option[Seq[Node]]} />, * so that Options can be used for optional attributes. */ private def test2 { val x1: Option[Seq[Node]] = Some(<b>hello</b>) val n1 = <elem key={x1} />; println("node="+n1+", key="+n1.attribute("key")) val x2: Option[Seq[Node]] = None val n2 = <elem key={x2} />; println("node="+n2+", key="+n2.attribute("key")) } private def test3 { // this demonstrates how to handle entities val s = io.Source.fromString("<a> </a>") object parser extends xml.parsing.ConstructingParser(s, false /*ignore ws*/) { override def replacementText(entityName: String): io.Source = { entityName match { case "nbsp" => io.Source.fromString("\u0160"); case _ => super.replacementText(entityName); } } nextch; // !!important, to initialize the parser } val parsed = parser.element(TopScope) // parse the source as element // alternatively, we could call document() parsed }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?