Scala XML 概述

本節(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

注:

  1. 在使用 \() 方法查找屬性時, 查找的的范圍不是子節(jié)點的屬性, 而是當(dāng)前節(jié)點的屬性。
  2. 可以使用 \@() 方法直接獲取當(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?)

參考資料

Scala XML解析庫
scala.XML處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容