这两个看起来非常相似。在我在下面的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之间有什么区别?
答案 0 :(得分:2)
表示带有标记树节点的XML的抽象类。此类包含用于导航的XPath子集的实现。
案例类Elem扩展了Node类,提供了表示XML元素的不可变数据对象。
在scala Elem
中使用嵌入式xml语法时,因为它是scala所知道的Node
的唯一具体实现。
您无法在不实施其抽象方法(Node
和child
)的情况下创建label
的实例。 Elem
为您完成此操作,并提供了一种通过标准API创建Node
的简便方法。
Elem
还添加了一些通常有用的辅助方法。在需要在接受Node
或Elem
之间做出决定的方法中,取决于方法内是否需要这些额外功能。接受Node
会使您处于更灵活的状态,以接受该类的任何实现。接受Elem
可能会为您提供一些额外的帮助,但它限制您仅接受Elem
Node
次Elem
次实施。许多Node
方法都返回NodeSeq
(或Node
),因此一般来说,您希望接受更通用的NodeSeq
(或{{ 1}})而不是Elem
。
除了这个讨论之外,通常认为接受可能性最小的类型(Node
)作为参数并返回尽可能最具体的类型(Elem
)的良好做法: / p>
def f(x: Node): Elem = ...
仍应考虑具体用例。
答案 1 :(得分:1)
简单回答:XML树中有几种节点:元素,文本节点,属性节点,注释节点等。所以每个元素都是一个节点,但不是每个节点都是一个元素。