我使用VS 2012 Trial和FSharp.Data库进行XML解析。当我构建项目时,所有类型提供程序信息都会变成错误--导致拒绝编译--类似于:
更新-尝试构建(Framework4.5)后的输出
------ Build started: Project: temp3, Configuration: Debug Any CPU ------
C:\Program Files (x86)\Microsoft SDKs\F#\3.0\Framework\v4.0\fsc.exe
-o:obj\Debug\temp3.dll -g --debug:full --noframework --define:DEBUG
--define:TRACE --doc:bin\Debug\temp3.XML --optimize- --tailcalls-
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\FSharp.Core.dll"
-r:C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\packages\FSharp.Data.1.1.9\lib\net40\FSharp.Data.DesignTime.dll
-r:C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\packages\FSharp.Data.1.1.9\lib\net40\FSharp.Data.dll
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Numerics.dll"
-r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.Linq.dll"
--target:library --warn:3 --warnaserror:76 --vserrors --validate-type-providers
--LCID:1033 --utf8output --fullpaths --flaterrors --subsystemversion:6.00
--highentropyva+ "C:\Users\Laura\AppData\Local\Temp\.NETFramework,Version=v4.5.AssemblyAttributes.fs" Library1.fs
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(31,122):
error FS0039: The type 'Transaction' is not defined
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(32,21):
error FS0072: Lookup on object of indeterminate type based on information
prior to this program point.
A type annotation may be needed prior to this program point to constrain
the type of the object. This may allow the lookup to be resolved.
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(33,85):
error FS0039: The field, constructor or member 'Postdate' is not defined
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,38):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate
type based on information prior to this program point. Consider adding
further type constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,74):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(34,118):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,39):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,68):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,93):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
C:\Users\Laura\BTSync\Dropbox\VisualStudio\Projects\temp3\temp3\Library1.fs(35,125):
error FS0752: The operator 'expr.[idx]' has been used on an object of indeterminate type
based on information prior to this program point. Consider adding further type
constraints
Done building project "temp3.fsproj" -- FAILED.
Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========结束更新
The type 'Transaction' is not defined和
Look up on object of indeterminate type based on information prior to this
program point. A type annotation may be needed prior to this program point
to constrain the type of the object. This may allow the lookup to be resolved.和
The field, constructor or member 'Postdate' is not defined我的模块上面有open Fharp.Data和参考System.Xml.Linq。
我的解决方案文件: https://dl.dropboxusercontent.com/u/74660436/temp3.zip
我的XML文件: https://dl.dropboxusercontent.com/u/74660436/KMyMoneySampleFile.xml
样本代码:
namespace KMyMoney
open System.IO
open System.IO.Compression
open FSharp.Data
module Read =
let decompressFileAndRead sourceFile = (new StreamReader(new GZipStream(File.OpenRead(sourceFile), CompressionMode.Decompress))).ReadToEnd()
type KMyMoney = XmlProvider<"KMyMoneySampleFile.xml">
let kMyMoney (sourceData:string) = KMyMoney.Load(sourceData)
let getAccountNames sourceData =
(kMyMoney sourceData).Accounts.GetAccounts()
|> Array.map (fun acc -> acc.Id, acc.Name)
|> Map.ofArray
let getPayeeNames sourceData =
(kMyMoney sourceData).Payees.GetPayees()
|> Array.map (fun p -> p.Id, p.Name)
|> Map.ofArray
type TransactionNew = {Id:string; Commodity:string; Date:System.DateTime; Account:string option; Amount:float; Payee:string option
; Category:string option; Number:string; Memo:string; Shares:float}
let amount (value:string) =
let divideArray (values:float[]) = values.[0]/values.[1]
value.Split("/".[0]) |> Array.map float |> divideArray
let splitTransaction (accNames:Map<string,string>) (payeeNames:Map<string,string>) (transaction:KMyMoney.DomainTypes.Transaction) =
let split = transaction.Splits.GetSplits()
{Id = transaction.Id; Commodity = transaction.Commodity; Date = transaction.Postdate
; Account = accNames.TryFind(split.[0].Account); Amount = amount split.[0].Value; Payee = payeeNames.TryFind(split.[1].Payee)
; Category = accNames.TryFind(split.[1].Account); Number = split.[0].Number; Memo = split.[0].Memo; Shares = amount split.[0].Shares}发布于 2013-09-05 04:22:12
决议:已在FSharp.Data 1.1.10 (努基特)中解决了这个问题。见下文的评论。
更新:I使用以下代码处理相同的问题:
module XmlTypeProviderIssue
open System
open FSharp.Data
type Html = XmlProvider<"""
<div>
<span>
<ul>
<li/>
</ul>
</span>
</div>""">
let html = Html.GetSample()
// Div is defined
let divWorks (div:Html.DomainTypes.Div) = ()
// Span is defined
let spanWorks (span:Html.DomainTypes.Span) = ()
// Ul is not
let ulBreaks (ul:Html.DomainTypes.Ul) = ()
// and neither is Li
let liBreaks (li:Html.DomainTypes.Li) = ()本质上,DomainTypes出现在intellisense中,但是编译器给出了一个Error FS0039: The type 'Ul' is not defined (FS0039)错误,对于'Li‘也是这样。
原始答案:--我没有给您一个正确的答案,但是有趣的是,如果您从XML中删除<TRANSACTIONS></TRANSACTIONS>标记,那么它构建得很好。
也就是说,改变这一点:
<TRANSACTIONS count="2">
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>
</TRANSACTIONS>对此:
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>
<TRANSACTION postdate="2005-01-05" commodity="USD" memo="" id="T000000000000001557" entrydate="2013-07-03">
<SPLITS>
<SPLIT payee="P000015" reconcileflag="0" shares="-121041/100" reconciledate="" action="Withdrawal" bankid="" account="A000106" number="" value="-121041/100" memo="" id="S0001"/>
<SPLIT payee="P000015" reconcileflag="0" shares="121041/100" reconciledate="" action="" bankid="" account="A000006" number="" value="121041/100" memo="" id="S0002"/>
</SPLITS>
</TRANSACTION>https://stackoverflow.com/questions/18453911
复制相似问题