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

Reading Xml file throws an error - FAKE F#MAKE

我正在使用 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
)

如果您查看 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 source,如果您未在输入文档中使用 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
)

顺便说一句,既然我已经看过 ,我想您会想要 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 文件。