Scala中Node和Elem之间有什么区别?

时间:2016-08-02 17:54:49

标签: xml scala

这两个看起来非常相似。在我在下面的REPL中运行的函数中,它们对于返回类型似乎是可互换的。

scala> import scala.xml.{Elem, Node}
import scala.xml.{Elem, Node}

scala> def addChild(parent: Elem, child: Node): Node = {
     |     parent.copy(child = parent.child ++ child)
     |   }
addChild: (parent: scala.xml.Elem, child: scala.xml.Node)scala.xml.Node

但是,我发现Elem具有.child属性,而Node则没有。一般来说,Elem与Node之间有什么区别?

2 个答案:

答案 0 :(得分:2)

Node scala documentation说:

  

表示带有标记树节点的XML的抽象类。此类包含用于导航的XPath子集的实现。

Elem scala documentation说:

  

案例类Elem扩展了Node类,提供了表示XML元素的不可变数据对象。

在scala Elem中使用嵌入式xml语法时,因为它是scala所知道的Node的唯一具体实现。

您无法在不实施其抽象方法(Nodechild)的情况下创建label的实例。 Elem为您完成此操作,并提供了一种通过标准API创建Node的简便方法。

Elem还添加了一些通常有用的辅助方法。在需要在接受NodeElem之间做出决定的方法中,取决于方法内是否需要这些额外功能。接受Node会使您处于更灵活的状态,以接受该类的任何实现。接受Elem可能会为您提供一些额外的帮助,但它限制您仅接受Elem NodeElem次实施。许多Node方法都返回NodeSeq(或Node),因此一般来说,您希望接受更通用的NodeSeq(或{{ 1}})而不是Elem

除了这个讨论之外,通常认为接受可能性最小的类型(Node)作为参数并返回尽可能最具体的类型(Elem)的良好做法: / p>

def f(x: Node): Elem = ...

仍应考虑具体用例。

答案 1 :(得分:1)

简单回答:XML树中有几种节点:元素,文本节点,属性节点,注释节点等。所以每个元素都是一个节点,但不是每个节点都是一个元素。