读取Xml文件会引发错误 - FAKE F#MAKE

时间:2017-03-21 06:23:04

标签: f# f#-interactive f#-3.0 f#-data f#-fake

我正在使用XMLHelper.XMLRead在FAKE脚本中读取XML文件,但它正在抛出一个错误,即

The type '(string -> string ->seq<string>)' is not a type whose value can be enumerated with this syantax , i.e. is not compatible with either seq<_>,IEnumerable<_> or IEnumerable and does not have a GetEnumerator method

以下是我的代码:

let x = XMLHelper.XMLRead true "D:/test/Version.Config" "/version/major/minor" 
Target "New" (fun _ ->
    for i in x do
        printf "%s" i
)

1 个答案:

答案 0 :(得分:3)

如果查看API documentation for XMLHelper,您会发现XMLRead的函数签名如下所示:

failOnError:bool -> xmlFileName:string -> nameSpace:string -> prefix:string -> xPath:string -> seq<string>

您似乎正在指定failOnErrorxmlFileNamenameSpace参数*,但您没有指定最后两个字符串参数。由于F#使用partial application,这意味着您从XMLRead调用中获取的内容是一个等待另外两个字符串参数的函数(因此string -> string -> (result)函数签名你得到的错误信息。)

*您可能希望"/version/major/minor"填充xPath参数,但F#按给定的顺序应用参数,因此它填充了第三个参数,即nameSpace

要解决此问题,请指定XMLRead期望的所有参数。我查看了XMLRead源代码,如果您未在输入文档中使用XML命名空间,则nameSpaceprefix参数应为空字符串。所以你想要的是:

let x = XMLHelper.XMLRead true "D:/test/Version.Config" "" "" "/version/major/minor" 
Target "New" (fun _ ->
    for i in x do
        printf "%s" i
)
顺便说一下,既然我已经看过your other question了,我想你会想要XMLHelper.XMLRead_Int函数:

let minorVersion =
    match XMLHelper.XMLRead_Int true "D:/test/Version.Config" "" "" "/version/major/minor" with
    | true, v -> v
    | false, _ -> failwith "Minor version should have been an int"

一旦您的代码越过该行,您在minorVersion中有一个int,或者您的构建脚本抛出错误并退出,以便您可以修复Version.Config文件。