F# &引用;“类型提供程序”;在构建项目时无法识别

F# &引用;“类型提供程序”;在构建项目时无法识别,f#,type-providers,f#-data,F#,Type Providers,F# Data,我正在使用VS2012试用版和FSharp.Data库进行XML解析。当我构建项目时,所有类型提供程序信息都会变成错误-这会导致拒绝编译-如: 更新-尝试构建后的输出(框架4.5) 结束更新 The type 'Transaction' is not defined 及 及 我已经在我的模块和参考System.Xml.Linq上面打开了Fharp.Data 我的解决方案文件: 我的XML文件: 示例代码: namespace KMyMoney open System.IO open Sys

我正在使用
VS2012试用版和
FSharp.Data
库进行
XML
解析。当我构建项目时,所有类型提供程序信息都会变成错误-这会导致拒绝编译-如:

更新-尝试构建后的输出(框架4.5)

结束更新

The type 'Transaction' is not defined

我已经在我的模块和参考
System.Xml.Linq
上面打开了Fharp.Data

我的解决方案文件:

我的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}
名称空间KMyMoney
开放系统
开放系统IO压缩
打开FSharp.Data
模块读取=
让decompressFileAndRead sourceFile=(新的StreamReader(新的GZipStream(File.OpenRead(sourceFile),CompressionMode.decompresse))).ReadToEnd()
类型KMyMoney=XmlProvider
让kMyMoney(sourceData:string)=kMyMoney.Load(sourceData)
让getAccountNames源数据=
(kMyMoney sourceData).Accounts.GetAccounts()
|>Array.map(趣味附件->附件Id,附件名称)
|>阵列地图
让GetPayeNamesSourceData=
(kMyMoney sourceData).Payees.getPayes()
|>Array.map(乐趣p->p.Id,p.Name)
|>阵列地图
键入TransactionNew={Id:string;商品:string;日期:System.DateTime;帐户:string选项;金额:浮动;收款人:string选项
;类别:字符串选项;编号:字符串;备注:字符串;共享:float}
出租金额(值:字符串)=
让divideArray(值:float[])=值。[0]/值。[1]
value.Split(“/”[0])|>Array.map float |>divideArray
let splitTransaction(帐户名:Map)(收款人名称:Map)(事务:KMyMoney.DomainTypes.transaction)=
let split=transaction.Splits.GetSplits()
{Id=transaction.Id;Commodity=transaction.Commodity;Date=transaction.Postdate
;Account=accNames.TryFind(拆分[0]。Account);Amount=Amount拆分[0]。Value;payene=payenames.TryFind(拆分[1]。收款人)
;Category=accNames.TryFind(拆分[1]。帐户);Number=split[0]。Number;Memo=split[0]。Memo;Shares=amount split[0]。Shares}

解决方案:此问题已在FSharp.Data 1.1.10()中修复。见下面的评论


更新:我使用以下代码遇到了相同的问题:

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) = ()
为此:

<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>


我在这里描述了这个错误的一些常见原因:-可能是其中之一…@TomasPetricek,我终于测试了你的三个想法。不幸的是,它们都不适用于我的情况。我调查了这三个方面,对于你指出的问题,我这边的一切都很好。我想我得继续寻找解决办法。谢谢你的帮助!另一种尝试是创建一个空白脚本文件,并使用
#r
从那里引用库。然后检查
#r
行上是否有任何错误消息。另一个可能的问题是,如果类型提供程序DLL位于某个网络共享上…@TomasPetricek,它只在我的一台计算机上。我试试r,看看会发生什么。有趣。我想知道为什么会出现这个问题。我想它确实表明,它是在类型提供程序端有缺陷的。谢谢你确实得到了它,这样我就可以编译了。如果我去掉事务标签,我不知道这个项目是否会工作。6天后我会给你100英镑。不过我会坚持一点,以防万一我也需要给别人加分。不确定如何传输点-我确信这是可能的。我还没有查看XML类型提供程序的源代码以确定是否存在问题,但它确实值得一看。我已经用一个更简单的XML示例重新创建了它,所以我会让它处于一个清晰的状态,发布它,也许有人可以对这个问题有所了解。@TroyKershaw如果您有一个简单的复制,请添加到GitHub上的bug报告的链接:@TomasPetricek到上面的GitHub问题。@Jon49上面的GitHub问题有一个修复程序。我不确定Nuget何时会发布,所以现在您可能必须从源代码构建。
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}
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) = ()
<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>