13.3.1 實現 xml 輔助函式
linq to xml 主要用於 c# 和 vb,在 f# 中使用可能有些麻煩。例如,f# 不支援隱式型別轉換(因為這會使型別推斷複雜),所以,每次我們指定元素名,必須使用 xname.get,而不是只使用乙個字串。或者,我們可以寫乙個簡單的工具函式或自定義運算子,來完成這些。
我們可以很容易地實現幾個 f# 函式,把 linq to xml 最常用的部分打包起來,提供乙個"f#-友好"的處理資料的方式。你可以看到在清單 13.8 中,大多數函式非常簡單。這個是用 f# interactive 建立的,所以,可以使用推導出的型別簽名,來了解函式做了什麼。乙個值得注意的方面是,每個函式取輸入的元素作為其最後乙個引數,這意味著,我們可以使用流運算子,來組合這些函式。
listing 13.8 helper functions for reading xml (f# interactive)
> #r "system.xml.dll"
#r "system.xml.linq.dll"
open system.xml.linq;;
> let wb = "";;
val wb : string =
> let xattr s (el:xelement) =
el.attribute(xname.get(s)).value
let xelem s (el:xcontainer) =
el.element(xname.get(s, wb))
let xvalue (el:xelement) =
el.value
let xelems s (el:xcontainer) =
el.elements(xname.get(s, wb));;
val xattr : string -> xelement -> string
val xelem : string -> xcontainer -> xelement
val xvalue : xelement -> string
val xelems : string -> xcontainer -> seq
> let xnested path (el:xcontainer) =
let res = path |> seq.fold (fun xn s–>
let child = xelem s xn
child :> xcontainer) el
res :?> xelement
;; val xnested : seq-> xcontainer –> xelement
大多數輔助函式是很簡單的。xattr返回指定屬性的值;xelem返回指定名字的子元素;xvalue讀取元素內的文字;xelems返回指定名字的所有子元素;xnested更有趣,返回由給定路徑作為元素的名字的序列所指定乙個子節點。當訪問元素時,我們指定的 xml 命名空間,用在從世界銀行返回的文件中。當我們在本章的後面,將使用這些輔助函式時,只需要提供元素的本地名稱。
清單13.8 首先引用了linq to xml 所需的程式集,並開啟包含 xelement 這樣的類的命名空間。第一組的函式用於訪問任何給定的元素的子節點、屬性或值。注意,xelem 函式取 xcontainer 作為引數值,這意味著,既可以於普通的元素,也可以用於表示整個文件的物件。這是可能的,因為,當將例項作為輸入引數值傳遞給函式或方法時,f# 可以隱式轉換為基類或實現的介面。在其他地方,沒有隱式轉換,比如,從 lambda 函式返回結果。這會使 xnested 函式稍微有點複雜,就需要增加幾個新的顯式強制轉換。
xnested 函式取乙個名稱序列作為引數值,並沿著這個路徑,去查詢深層巢狀的元素。它用 seq.fold 實現,並使用輸入的元素作為初始狀態,路徑中的每個名稱都執行這個 lambda 函式。它查詢具有指定名稱的當前元素的子元素,並把它作為乙個新的子元素返回。我們想要輸入型別成為 xcontainer,所以,摺疊操作使用這個型別來表示當前狀態。因此,我們需要在 lambda 函式內部,把返回的元素向上轉換成 xcontainer,把最終結果向下轉換成 xelement。
14 3 3 實現輔助函式
14.3.3 實現輔助函式 在討論計算動物位置的 之前,我們要稍稍離題。我們需要實現幾個函式,將由確定動物和捕食者位置的演算法使用。出於各種用途,這些函式需要使用隨機數,要正確地生成隨機數,首先需要討論如何安全地訪問,那些不是執行緒安全 thread safe 的物件。這可能是個問題,當我們處理具有...
14 3 3 實現輔助函式
14.3.3 實現輔助函式 在討論計算動物位置的 之前,我們要稍稍離題。我們需要實現幾個函式,將由確定動物和捕食者位置的演算法使用。出於各種用途,這些函式需要使用隨機數,要正確地生成隨機數,首先需要討論如何安全地訪問,那些不是執行緒安全 thread safe 的物件。這可能是個問題,當我們處理具有...
基於XML操作輔助類
在實際的專案應用中,很多地方需要用的xml,程式的配置,一些客戶配置的資料,但是主要用在配置檔案,web services,跨系統的資訊傳遞。分析用過jaxb,不過,schema改變之後,還有就是電子商務中的xml,比如ebxml,ariba的cxml,commerceone自己有一套,sap也支援...