LINQ学习笔记:X-DOM概览
X-DOM概览
X-DOM的核心类型. XElement是所有这些类型当中最常用的. XObject是整个继承体系中的根源; XElement和XDocument是整个箱体层级的根.
考察下面的代码:
1: string xml =
2: @"<customer id='123' status='archived'>
3: <firstname>Joe</firstname>
4: <lastname>Bloggs<!--nice name -></lastname>
5: </customer>";
6:
7: XElement customer = XElement.Parse (xml);
XObject是所有XML内容的抽象基类. 它定义了一个指向父元素的连接以及一个可选的XDocument.
XNode是除开属性(attributes)之外的多数XML内容的基类. 一个区别就是XNode可以处理一个有序的混合类型的XNode的集合, 考虑下面的XML片段:
1: <data>
2: Hello world
3: <subelement1/>
4: <!--comment-->
5: <subelement2/>
6: </data>
在父元素<data>里面, 第一个节点是一个XText(Hello world), 接着是一个XElement节点, 然后是一个XComment节点, 最后是另外的一个XElement节点. 相反的, 一个XAttribute只能配对出现.
虽然一个XNode能够访问它的父元素, 但它并没有子节点的概念; 这是它的子类型XContainer的工作. XContainer定义了一些用于处理子节点的成员并且它也是XElement和XDocument的抽象基类.
XElement引入了一些管理attributes的成员例如Name和Value. 对于那种元素只拥有一个单一的XText子节点的情况, Value属性可以读取或者设置子节点的内容, 而不再需要不必要的导航. 感谢Value, 大多数情况下你可以避免和XText节点直接打交道.
XDocument表示一棵XML树的根. 更精确的说, 它包装了根元素, 增加了一个XDeclaration, 处理指令, 以及其它的根级别的相关操作. 不像W3C DOM, 它的使用是可选的, 你甚至可以在没有创建XDocument的时候加载, 操作, 或者保存一个X-DOM. 对于XDocument的非依赖意味着你可以高效而简易的将一个字节点树移到另外一个X-DOM层级上面.
加载与解析
XElement与XDocument两者都提供了静态Load和Parse的方法从一个已存在的数据源中来构建一棵X-DOM树.
- Load从文件, URI, TextReader或者XMLReader创建X-DOM
- Parse从一个string创建了X-DOM
XNode也提供了一个ReadFrom的静态方法, 该方法实例化来自于XmlReader的任何节点类型. 不像Load, 它读取了一个节点之后就立即停止, 你可以通过手动读取XmlReader来继续进行处理. 另外你也可以反向操作, 使用一个XmlReader(CreateReader)或者XmlWriter(CreateWriter)来读/写一个XNode.
例如:
1: XDocument fromWeb = XDocument.Load
2: ("http://albahari.com/sample.xml");
3:
4: XElement fromFile = XElement.Load
5: (@"e:mediasomefile.xml");
6:
7: XElement config = XElement.Parse (
8: @"<configuration>
9: <client enabled='true'>
10: <timeout>30</timeout>
11: </client>
12: </configuration>");
保存与序列化
在任何节点上调用ToString都会将其内容转换成一个XML字符串-该字符串就像我们看到的那样已经被断行符格式化过了.(我们还可以在调用ToString的时候指定SaveOptions.DisableFormatting, 这样将禁用格式化断行符)
同时XElement和XDocument也提供了一个Save方法用于将一个X-DOM写入到文件中, TextWriter 或者 XmlWriter. 如果你选择了使用文件, 那么XML declaration将会被自动写入. 另外XNode也包含了一个WriteTo的方法, 其接收一个XmlWriter参数.
待续!