我爱编程

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

注:

  1. 在使用 \() 方法查找属性时, 查找的的范围不是子节点的属性, 而是当前节点的属性。
  2. 可以使用 \@() 方法直接获取当前节点属性的值(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?)

参考资料

Scala XML解析库
scala.XML处理

上一篇下一篇

猜你喜欢

热点阅读