【问题标题】:F# Xml Type Provider test if node existsF# Xml Type Provider 测试节点是否存在
【发布时间】:2016-03-15 21:37:33
【问题描述】:

这似乎应该是微不足道的。我正在解析许多 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,我将 height 元素添加到 XmlProvider 示例数据中。这就是它在我的代码中的样子。我将解析一个与示例类似但不包含所有相同节点的 XML 文件。

标签: xml f# type-providers


【解决方案1】:

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

【讨论】:

  • 该死。在回答之前,我确实阅读了有关 XmlProvider 的文档......显然还不够彻底。谢谢你的课!请投票删除我的答案...
  • @HelgeReneUrholm,我也阅读了文档,但没有找到此功能。这就是促使我提出这个问题的原因。
猜你喜欢
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多