Scala XML 概述
2018-04-04 本文已影响28人
蔡洪宇
本节仅为概述, 稍后会推一篇 Scala-XML 的详细说明
节点
Scala 提供了对 XML 字面量的内建支持, 我们可以很容易的在程序代码中生成 XML 片段
val doc = // doc: Elem
<a>
1
<b>
2
</b>
</a>
println(doc.label)
}
Output:
a
序列
单个节点相当于长度为 1 的序列
如果通过编程方式构建节点序列,可以使用 NodeBuffer
, 它是 ArrayBuffer[Node]
的子类
NodeBuffer
是一个 Seq[Node]
, 可以被隐式转换为 NodeSeq
, 一旦完成,最好别再修改它, 因为 XML 节点序列
应该是不可变的
获取属性
通过方法
要获取某个元素的属性, 可以使用 Atrributes
属性, 它将产生一个matedata
的对象, 这个对象几乎等同于从一个属性键到属性值的映射,你可以用 () 操作符访问给定键的值;
val item =
<a href="http://salca-lang.org">
the
<em>scala</em>
language
</a>
item.attribute("href")
// res0: Option[Seq[scala.xml.Node]] = Some(http://salca-lang.org)
item.attributes
// res1: scala.xml.MetaData = href="http://salca-lang.org"
通过查询
使用 \()
\\()
方法可以获取属性, 在属性名字符串前加上 @
表示查询属性, 如 \("@num")
表示查询 num
属性。
val item =
<a href="http://salca-lang.org">
the
<em href="http://www.bing.com">scala</em>
language
</a>
item \("@href")
// res: scala.xml.NodeSeq = http://salca-lang.org
item \@("href")
// res: String = http://salca-lang.org
注:
- 在使用
\()
方法查找属性时, 查找的的范围不是子节点的属性, 而是当前节点的属性。 - 可以使用
\@()
方法直接获取当前节点属性的值(Not NodeSeq), 使用属性名作为参数, 无需再添加@
。
查询节点
通过名称
\()
以及 \\()
方法签名类似, 接收节点名称作为参数(String
类型), 返回节点序列(NodeSeq
类型)。
-
\()
方法返回当前节点下一级子节点中指定名称节点的序列。 -
\\()
方法返回当前节点所有子节点中指定名称节点的序列。
节点查询支持使用模式匹配的方式。
使用模式匹配方式查询节点时,匹配表达式中的节点标签不能带有属性。
遍历节点
Node
类型的成员 child
是子节点的序列(Seq[Node]
类型)
val item =
<a href="http://salca-lang.org">
<em href="http://www.bing.com"></em>
</a>
item.child.length
// res0: Int = 3 (Why 3?)