2016-03-15 59 views
4

這似乎應該是微不足道的。我正在解析許多XML文件,其中一些文件包含所有預期的節點,其中一些節點沒有。我需要能夠測試一個節點的存在。我正在使用F#Xml類型提供程序。此代碼不起作用,但它說明了我正在嘗試做什麼。F#Xml類型提供程序測試,如果節點存在

#r "../../../bin/FSharp.Data.dll" 
#r "System.Xml.Linq.dll" 
open FSharp.Data 

type Author = XmlProvider<"""<author name="Paul Feyerabend" born="1924"><height>10</height></author>"""> 
let sample = Author.Parse("""<author name="Karl Popper" born="1902" />""") 
let containsHeight = sample.Height <> null // I want this to return false 
+0

@CoderDennis,我將高度元素添加到XmlProvider示例數據。這是它在我的代碼中看起來的樣子。我會解析一個類似於這個例子但不包含所有相同節點的XML文件。 –

+0

相關:http://stackoverflow.com/q/24524247/126014 –

回答

3

XML Type Provider的工作原理是從樣本中推斷出類型。

open FSharp.Data 

type Author = XmlProvider<""" 
<samples> 
    <author name="Paul Feyerabend" born="1924"> 
     <height>10</height> 
    </author> 
    <author name="Karl Popper" born="1902" /> 
</samples>""", SampleIsList = true> 

這使您可以同時加載popperfeyerabend

let popper = Author.Parse("""<author name="Karl Popper" born="1902" />""") 
let feyerabend = Author.Parse("""<author name="Paul Feyerabend" born="1924"><height>10</height></author>""") 

現在,您可以測試高度是否有您可以通過使用可選的SampleIsList參數提供一個以上的樣本:

> popper.Height.IsSome;; 
val it : bool = false 
> feyerabend.Height.IsSome;; 
val it : bool = true 
> feyerabend.Height |> Option.get;; 
val it : int = 10 
+1

darn。並且在回答之前我確實閱讀了XmlProvider上的文檔......顯然不夠。 thx的教訓!請投票刪除我的答案... –

+0

@HelgeReneUrholm,我也閱讀了文檔,並沒有找到這個功能。這就是促使我問這個問題的原因。 –

相關問題