Scala XML 概述

作者: 蔡洪宇 | 来源:发表于2018-04-04 16:58 被阅读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处理

    相关文章

      网友评论

        本文标题:Scala XML 概述

        本文链接:https://www.haomeiwen.com/subject/ftvkhftx.html