本節(jié)僅為概述, 稍后會推一篇 Scala-XML 的詳細(xì)說明
節(jié)點
Scala 提供了對 XML 字面量的內(nèi)建支持, 我們可以很容易的在程序代碼中生成 XML 片段
val doc = // doc: Elem
<a>
1
<b>
2
</b>
</a>
println(doc.label)
}
Output:
a
序列

單個節(jié)點相當(dāng)于長度為 1 的序列
如果通過編程方式構(gòu)建節(jié)點序列,可以使用 NodeBuffer, 它是 ArrayBuffer[Node] 的子類
NodeBuffer 是一個 Seq[Node] , 可以被隱式轉(zhuǎn)換為 NodeSeq, 一旦完成,最好別再修改它, 因為 XML 節(jié)點序列 應(yīng)該是不可變的
獲取屬性
通過方法
要獲取某個元素的屬性, 可以使用 Atrributes 屬性, 它將產(chǎn)生一個matedata 的對象, 這個對象幾乎等同于從一個屬性鍵到屬性值的映射,你可以用 () 操作符訪問給定鍵的值;
val item =
<a >
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 =
通過查詢
使用 \() \\() 方法可以獲取屬性, 在屬性名字符串前加上 @ 表示查詢屬性, 如 \("@num") 表示查詢 num 屬性。
val item =
<a >
the
<em >scala</em>
language
</a>
item \("@href")
// res: scala.xml.NodeSeq = http://salca-lang.org
item \@("href")
// res: String = http://salca-lang.org
注:
- 在使用
\()方法查找屬性時, 查找的的范圍不是子節(jié)點的屬性, 而是當(dāng)前節(jié)點的屬性。 - 可以使用
\@()方法直接獲取當(dāng)前節(jié)點屬性的值(Not NodeSeq), 使用屬性名作為參數(shù), 無需再添加@。
查詢節(jié)點
通過名稱
\() 以及 \\() 方法簽名類似, 接收節(jié)點名稱作為參數(shù)(String 類型), 返回節(jié)點序列(NodeSeq 類型)。
-
\()方法返回當(dāng)前節(jié)點下一級子節(jié)點中指定名稱節(jié)點的序列。 -
\\()方法返回當(dāng)前節(jié)點所有子節(jié)點中指定名稱節(jié)點的序列。
節(jié)點查詢支持使用模式匹配的方式。
使用模式匹配方式查詢節(jié)點時,匹配表達(dá)式中的節(jié)點標(biāo)簽不能帶有屬性。
遍歷節(jié)點
Node 類型的成員 child 是子節(jié)點的序列(Seq[Node] 類型)
val item =
<a >
<em ></em>
</a>
item.child.length
// res0: Int = 3 (Why 3?)