首页 > 代码库 > 使用 LINQ to XML

使用 LINQ to XML

 

使用 LINQ to XML

 

LINQ to XML 的目标是提供 XML 对象模型,能够很好地以LINQ 的函数风格进行编程。表 9-4 汇总了这个命名空间中的重要类。

表 9-4 由 LINQ to XML 提供的类

 

类名

父类

描述

XNode

 

这个类提供了应用于 XML 文档中的所有结点的基础功能。

XContainer

XNode

这个类提供了 XML 结点的功能,可以包含其他结点。

XDocument

XContainer

这个类把 XML 文档作为一个整体表示。

XElement

XContainer

这个类表示 XML 文档中元素,即,表示通常的 XML 结点可以是标记,<myTag  />,或包含其他标记或属性,如,myAttribute="myVal"。

XDocumentType

XNode

这个类表示文档类型标记。

XProcessInstruction

XNode

这个类表示处理指令,标记形式为 <? name instruction ?>。

XText

XNode

这个类表示包含在 XML 文档中的文本。

XName

 

这个类表示标记或属性的名字。

 

可以看到实际使用的这个对象模型,通过修改前一节的例子,把输出的纯文本改成 XML,用LINQ to XML 很容易就能完成。首先,修改 select 子句,使返回的元组成为 XEement:

 

|> select (fun m -> newXElement(XName.Get(m.Key), count m))

 

这就得到一个 XEements 数组,然后用它来初始化另一个 XEement,它提供文档的根;这时,调用根 XElement 的 ToString 方法,它将以字符串的形式提供 XML:

 

open System

open System.Linq

open System.Reflection

open System.Xml.Linq

 

//define easier access to LINQ methods

let select f s = Enumerable.Select(s, new Func<_,_>(f))

let where f s = Enumerable.Where(s, new Func<_,_>(f))

let groupBy f s = Enumerable.GroupBy(s, new Func<_,_>(f))

let orderBy f s = Enumerable.OrderBy(s, new Func<_,_>(f))

let count s = Enumerable.Count(s)

 

//query string methods using functions

let namesByFunction =

  (typeof<string>).GetMethods()

  |> where (fun m -> not m.IsStatic)

  |> groupBy (fun m -> m.Name)

  |> select (fun m -> newXElement(XName.Get(m.Key), count m))

  |> orderBy (fun e -> int e.Value)

 

//create an xml document with the overloads data

let overloadsXml =

  new XElement(XName.Get("MethodOverloads"), namesByFunction)

 

//print the xml string

printfn"%s"(overloadsXml.ToString())

 

[

需要引用 System.Xml 和 System.Xml.Linq

]

 

运行结果如下:

 

<MethodOverloads>

  <get_Chars>1</get_Chars>

  <CopyTo>1</CopyTo>

  <GetHashCode>1</GetHashCode>

  <get_Length>1</get_Length>

  <TrimStart>1</TrimStart>

  <TrimEnd>1</TrimEnd>

  <Contains>1</Contains>

 <ToLowerInvariant>1</ToLowerInvariant>

 <ToUpperInvariant>1</ToUpperInvariant>

  <Clone>1</Clone>

  <Insert>1</Insert>

  <GetTypeCode>1</GetTypeCode>

  <GetEnumerator>1</GetEnumerator>

  <GetType>1</GetType>

  <ToCharArray>2</ToCharArray>

  <Substring>2</Substring>

  <Trim>2</Trim>

  <IsNormalized>2</IsNormalized>

  <Normalize>2</Normalize>

  <CompareTo>2</CompareTo>

  <PadLeft>2</PadLeft>

  <PadRight>2</PadRight>

  <ToLower>2</ToLower>

  <ToUpper>2</ToUpper>

  <ToString>2</ToString>

  <Replace>2</Replace>

  <Remove>2</Remove>

  <Equals>3</Equals>

  <EndsWith>3</EndsWith>

  <IndexOfAny>3</IndexOfAny>

 <LastIndexOfAny>3</LastIndexOfAny>

  <StartsWith>3</StartsWith>

  <Split>6</Split>

  <IndexOf>9</IndexOf>

  <LastIndexOf>9</LastIndexOf>

</MethodOverloads>

 

 

第九章小结

 

这一章我们已经学习了在 F# 中访问数据,可以看出 F# 与 .NET 库的组合,功能强大又很简单,不管是何种数据源。下一章我们将学习如何使应用程序并行化的新课题。