我有一个问题。我在一个看起来如下的文件中进行了简单的配置:
<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中“多个简单元素的类型”部分的内容进行操作。有没有办法将其转换为序列。
答案 0 :(得分:2)
如果您只有这两种类型,最简单的方法(即:最懒惰的方法)是将样本加倍:
<RequestParameters>
<ModuleIdentification Interval="500" />
<ModuleIdentification Interval="500" />
<SectionIdentification Interval="500" />
<SectionIdentification Interval="500" />
</RequestParameters>
现在您可以使用以下方法访问元素数组:
RequestParameters.ModuleIdentifications
和RequestParameters.SectionIdentifications
。
一种更好的方法是为您的XML生成一个XSD, 并将类型提供程序与
一起使用FSharp.Data.XmlProvider<Schema = ...>