F# Xml类型提供程序测试节点是否存在

4

这似乎应该是微不足道的。我正在解析许多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

@CoderDennis,我在XmlProvider示例数据中添加了height元素。这是我的代码中的样子。我将解析一个类似于示例但不包含所有相同节点的XML文件。 - Matthew Crews
相关链接:https://dev59.com/z4Hba4cB1Zd3GeqPNSWF - Mark Seemann
1个回答

3
XML类型提供程序通过从示例中推断类型来工作。您可以使用可选的SampleIsList参数提供多个示例:
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>""")

现在您可以测试高度是否存在:
> popper.Height.IsSome;;
val it : bool = false
> feyerabend.Height.IsSome;;
val it : bool = true
> feyerabend.Height |> Option.get;;
val it : int = 10

1
糟糕,我在回答之前确实阅读了XmlProvider的文档...显然不够仔细。谢谢你的教训!请投票删除我的答案... - Helge Rene Urholm
@HelgeReneUrholm,我也阅读了文档,但没有找到这个功能。这就促使我提出了这个问题。 - Matthew Crews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接