使用 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,_>(f))

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

let orderBy f s = Enumerable.OrderBy(s,_>(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 库的组合,功能强大又很简单,不管是何种数据源。下一章我们将学习如何使应用程序并行化的新课题。

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念