我可以在函数式语言中将xml树作为intellisense使用吗?

时间:2010-12-25 02:03:39

标签: xml f# functional-programming

在F#中,我想做类似的事情。

let xml = XDocument.Load(url);

可以动态解析xml,我会在intellisense中获得xml树。

let products = xml.root.products;

数组可以过滤而值和属性可直接使用

let productSoap = xml.root.products.Where(o => o.productName == "Soap");
let documentName = xml.root.DocumentName;

为什么我需要在函数式语言中使用System.Xml和System.Xml.Linq来解析xml?

1 个答案:

答案 0 :(得分:1)

以下评论是正确的,遗憾的是您需要等待F#的Type Providers功能才​​能在“开发时间”执行此操作。 (这样F#的IntelliSense将进行XML解析,并在编写代码时为您提供数据。)

但是,与此同时,您可以使用XSD.exe tool生成包装XML文档的.NET库。请参阅快速教程here

工作流程是:

  1. 将XML文档提供给xsd.exe
  2. XSD.exe将输出一个可以加载/强类型化该XML文档的程序集
  3. IIRC,xsd.exe早在LINQ和更现代的.NET功能之前编写,因此生成的对象模型有点笨重。但是,它不仅仅是自己解析文档并使用XPath盲目查询数据。

    以下是教程中的代码段:

          StreamReader str = new StreamReader("cd_catalog.xml");
          XmlSerializer xSerializer = new XmlSerializer(typeof(CATALOG));
    
          CATALOG myCdCatalogue = (CATALOG)xSerializer.Deserialize(str);
    
          foreach (CATALOG.CDRow cd in myCdCatalogue.CD)
          {
            Console.WriteLine(cd.TITLE);
            Console.WriteLine(cd.ARTIST);
            Console.WriteLine(cd.COUNTRY);
            Console.WriteLine(cd.COMPANY);
            Console.WriteLine(cd.PRICE);
            Console.WriteLine(cd.YEAR);
            Console.WriteLine();
          }
          str.Close();