2016-03-15 63 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,我也阅读了文档,并没有找到这个功能。这就是促使我问这个问题的原因。 –

相关问题