用于C#的F#Xml TypeProvider

时间:2013-08-14 22:49:14

标签: c# .net f# type-providers f#-data

C#中有F# TypeProvider的等价物吗?我正在寻找使用C#读取Xml文件的最简单方法。此时我打算使用XDocument,但我想知道是否有更好的东西。

F#使得读取Xml文件非常容易,我想知道是否不应该为Xml处理切换语言!

4 个答案:

答案 0 :(得分:4)

有什么理由不能为您的解决方案添加F#库吗?该项目可以创建您想要的XML抽象,您可以从C#项目中使用它。

答案 1 :(得分:4)

不,不可能直接在C#中使用类型提供程序。

对于生成的类型提供程序,您可以在F#项目中“实例化”类型提供程序,然后使用C#中的类型提供程序,但这对于CsvProviderJsonProvider等已擦除类型的提供程序不起作用,XmlProviderFreebaseWorldbank。 (它适用于内置的SqlProvider和WsdlProvider,但)。

已经讨论过将CsvProviderJsonProviderXmlProvider切换到生成的模型,以便它们可用于C#(https://github.com/fsharp/FSharp.Data/issues/134#issuecomment-20104995)中的数据绑定,但这可能需要一段时间才能实现。

我的建议是完全切换到F#,或创建镜像类型提供程序创建的类型的记录类型。例如:

type T = {
    A : int
    B : string
    (...)
}

type XmlT = XmlProvider<"xml file">

let getXml() =
    let xml = XmlT.GetSample()
    { A = xml.A
      B = xml.B
      (...) }

答案 2 :(得分:4)

如前所述,C#不支持类型提供程序,并且没有简单的方法来模拟它们(正如Gustavo所提到的,你可以通过一个小的F#库使用生成的类型提供程序,但XML,JSON ,CSV和其他不是这种。)

我认为使用F#库进行处理是最好的方法。

更复杂的替代方法是编写代码,使您可以定义类型以在C#中对XML文件进行建模,然后自动将文件读入这些类。我不认为这样的事情存在,但我在F#中写了类似的东西(在类型提供者之前),所以你可以看到the snippet for inspiration。用法如下:

// Modelling RSS feeds - the following types define the structure of the
// expected XML file. The StructuralXml parser can automatically read
// XML file into a structure formed by these types.
type Title = Title of string
type Link = Link of string
type Description = Description of string

type Item = Item of Title * Link * Description
type Channel = Channel of Title * Link * Description * list<Item>
type Rss = Rss of Channel

// Load data and specify that names in XML are all lowercase
let url = "http://feeds.guardian.co.uk/theguardian/world/rss"
let doc : StructuralXml<Rss> = 
  StructuralXml.Load(url, LowerCase = true)

// Match the data against a type modeling the RSS feed structure
let (Rss(channel)) = doc.Root
let (Channel(_, _, _, items)) = channel
for (Item(Title t, _, _)) in items do
  printfn "%s" t

答案 3 :(得分:0)

我看了你在F#中的XmlProvider的链接,我在C#中没有看到类似的东西。我使用C#和Xml很多,经常使用XDocument和XElement来加载和解析Xml。一旦我将Xml加载到XDocument中,我就使用Linq to Xml来执行类似的操作。我经常使用Linq Pad对Xml进行一般性查询,这对C#很有用,但不确定F#。