我正在使用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
)
答案 0 :(得分:3)
如果查看API documentation for XMLHelper
,您会发现XMLRead
的函数签名如下所示:
failOnError:bool -> xmlFileName:string -> nameSpace:string -> prefix:string -> xPath:string -> seq<string>
您似乎正在指定failOnError
,xmlFileName
和nameSpace
参数*,但您没有指定最后两个字符串参数。由于F#使用partial application,这意味着您从XMLRead
调用中获取的内容是一个等待另外两个字符串参数的函数(因此string -> string -> (result)
函数签名你得到的错误信息。)
*您可能希望"/version/major/minor"
填充xPath
参数,但F#按给定的顺序应用参数,因此它填充了第三个参数,即nameSpace
。
要解决此问题,请指定XMLRead
期望的所有参数。我查看了XMLRead源代码,如果您未在输入文档中使用XML命名空间,则nameSpace
和prefix
参数应为空字符串。所以你想要的是:
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
文件。