2016-08-02 71 views
0

這兩個看起來很相似。在我在下面的REPL中運行的函數中,它們對於返回類型似乎是可以互換的。Scala中的Node和Elem有什麼區別?

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財產和節點不會。一般來說,Elem vs Node有什麼區別?

+0

@jwvh - 它編譯得很好。爲了清楚起見編輯過 – doub1ejack

+1

我發現Scala XML上的這篇博客很有用 - http://www.codecommit.com/blog/scala/working-with-scalas-xml-support。 –

回答

2

Node scala documentation說:

一個抽象類代表與標記的樹的節點XML。該類包含用於導航的XPath子集的實現。

Elem scala documentation說:

殼體類ELEM延伸Node類,提供表示一個XML元素的不可變數據對象。

當使用Scala中嵌入XML語法Elem s的生產,因爲它是Node唯一的具體實現,斯卡拉知道。

如果不實施抽象方法(childlabel),則無法創建Node的實例。 Elem爲您完成此操作,並提供了一種通過標準API創建Node的簡單方法。

Elem還增加了一些通常有用的幫助方法。在需要決定接受Node還是Elem的方法中,取決於方法內是否需要這些額外的特徵。接受Node會使您處於更靈活的狀態,以接受該類的任何實現。接受Elem可能會爲您提供一些額外的幫助程序,但它限制您只接受Elem實現Node。許多Elem的方法返回Node(或NodeSeq),所以一般而言,您會希望接受更通用的Node(或NodeSeq),而不是Elem

不僅僅是這個討論中,它通常被認爲是很好的做法,接受作爲參數的至少特定類型的可能(Node),並返回最具體類型的可能(Elem):

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

具體使用情況應該還是被考慮。

1

簡單的答案:XML樹中有幾種節點:元素,文本節點,屬性節點,註釋節點等。因此,每個元素都是一個節點,但不是每個節點都是一個元素。

相關問題