首页 > 代码库 > 使用 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 库的组合,功能强大又很简单,不管是何种数据源。下一章我们将学习如何使应用程序并行化的新课题。