F#XmlProvider和解析集合

时间:2020-02-17 09:51:16

标签: f#

我有一个问题。我在一个看起来如下的文件中进行了简单的配置:

<configuration>
  <Protocol Version="1" />
  <RequestParameters>
    <ModuleIdentyfication Interval="500" />
    <SectionIdentification Interval="500" />
  </RequestParameters>
</configuration>

配置文件与应用程序位于同一文件夹中,因此我的阅读模块如下所示:

[<Literal>]
let private cabinetConfigFilename : string = "cabinet.config";

type Communication = XmlProvider<cabinetConfigFilename>

let GetConnectionConfiguration : Async<Option<ServiceConfiguration>> = 
    async {
        let assemblyPathInfo = FileInfo(Assembly.GetEntryAssembly().Location);
        let configurationFilePath = Path.Combine(assemblyPathInfo.DirectoryName, cabinetConfigFilename);
        let root = Communication.Parse((File.ReadAllTextAsync(configurationFilePath) |> Async.AwaitTask |> Async.RunSynchronously))

        try
            let protocolVersion : uint8 = uint8 root.Protocol.Version 
            let requestParameters = Communication.Parse (string root.RequestParameters) 
            for param in requestParameters do printf " - " 

            return Some (ServiceConfiguration(protocolVersion))
        with
            | :? ArgumentNullException -> logger.Error("No IP address was given"); return None;
            | :? FormatException -> logger.Error("IP address incorrect format was given"); return None
    }

因此,获取Protocol.Version我没有问题,但是解析该RequestParameters的问题是,我得到了一个完整的XProvider对象,但不能将其用作seq。我尝试按照https://fsharp.github.io/FSharp.Data/library/XmlProvider.html中“多个简单元素的类型”部分的内容进行操作。有没有办法将其转换为序列。

1 个答案:

答案 0 :(得分:2)

如果您只有这两种类型,最简单的方法(即:最懒惰的方法)是将样本加倍:

<RequestParameters>
  <ModuleIdentification Interval="500" />
  <ModuleIdentification Interval="500" />
  <SectionIdentification Interval="500" />
  <SectionIdentification Interval="500" />
</RequestParameters>

现在您可以使用以下方法访问元素数组: RequestParameters.ModuleIdentificationsRequestParameters.SectionIdentifications

一种更好的方法是为您的XML生成一个XSD, 并将类型提供程序与

一起使用
FSharp.Data.XmlProvider<Schema = ...>