当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > LINQ学习笔记:XDocument文档与XML声明

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET 中的 LINQ学习笔记:XDocument文档与XML声明


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-13   浏览: 88 ::
收藏到网摘: n/a

文档与声明

XDocument

一个XDocument包装了根XElement并且允许你添加一个XDeclaration, 用于处理指令, 说明文档类型, 以及顶级的注释. XDocument是可选的, 并且能够被忽略或者省略, 这点与W3C DOM不同, 它并不是将所有的东西保持在一起的粘合剂.

XDocument提供了与XElement一样的构造函数, 是基于XContainer的, 同样也支持AddXXX, RemoveXXX以及ReplaceXXX方法. 与XElement不同的是, 一个XDocument只能接受有限的一些内容:

  • 一个单一XElement对象(根)
  • 一个单一的XDeclaration对象
  • 一个单一的XDocumentType对象(指向一个DTD)
  • 任何数量的XProcessingInstruction对象
  • 任何数量的XComment对象

所有这些, 只有根XElement是强制要求必须要有一个有效的XDocument. XDeclaration是可选的, 如果省略它, 在序列化的过程当中将会自动应用默认设置.

最简单的有效XDocument只需要有一个根元素

 1: var doc = new XDocument (
 2: new XElement ("test", "data")
 3: );

注意, 我们并没有包含XDeclaration对象. 但是如果你调用doc.Save保存, 你会发现文件中仍然会包含XML declaration, 因为这是默认生成的.

下面的例子产生了一个简单但正确的XHTML文件来演示XDocument能够接受的所有构造:

 1: var styleInstruction = new XProcessingInstruction (
 2: "xml-stylesheet", "href='styles.css' type='text/css'");
 3:
 4: var docType = new XDocumentType ("html",
 5: "-//W3C//DTD XHTML 1.0 Strict//EN",
 6: "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd",
 7: null);
 8:
 9: XNamespace ns = "http://www.w3.org/1999/xhtml";
 10: var root =
 11: new XElement (ns + "html",
 12: new XElement (ns + "head",
 13: new XElement (ns + "title", "An XHTML page")),
 14: new XElement (ns + "body",
 15: new XElement (ns + "p", "This is the content"))
 16: );
 17: var doc =
 18: new XDocument (
 19: new XDeclaration ("1.0", "utf-8", "no"),
 20: new XComment ("Reference a stylesheet"),
 21: styleInstruction,
 22: docType,
 23: root);
 24:
 25: doc.Save ("test.html");

最终生成的结果是:

 1: <?xml version="1.0" encoding="utf-8" standalone="no"?>
 2: <!--Reference a stylesheet-->
 3: <?xml-stylesheet xhref='styles.css' type='text/css'?>
 4: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 5: "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 6: <html xmlns="http://www.w3.org/1999/xhtml">
 7: <head>
 8: <title>An XHTML page</title>
 9: </head>
 10: <body>
 11: <p>This is the content</p>
 12: </body>
 13: </html>

XDocument还有一个Root属性用于快速访问文档中的单一元素. 其反向的链接是有XObject的Document属性提供, 并可以应用于树中的所有对象.

 1: Console.WriteLine (doc.Root.Name.LocalName); // html
 2: XElement bodyNode = doc.Root.Element (ns + "body");
 3: Console.WriteLine (bodyNode.Document == doc); // True

XDeclaration不是XNode, 而且不会出现在文档的Nodes集合中, 这点与备注, 根节点, 以及processing instructions节点是不同的. 相反, 它被赋值到了一个专用的属性Declaration上. 这就是为什么下面的例子”True”只重复了4次而不是5次

 1: Console.WriteLine (doc.Root.Parent == null); // True
 2: foreach (XNode node in doc.Nodes( ))
 3: Console.Write
 4: (node.Parent == null); // TrueTrueTrueTrue

XML声明

一个标准的XML文件通常会以类似下面的声明开始:

 1: <?xml version="1.0" encoding="utf-8"standalone="yes"?>

XML声明确保XML文件能够被解析器正确解析. XElement和XDocument在处理XML声明的时候遵循以下规则:

  • 调用Save(FileName)的时候总会写入一个声明
  • 调用Save(XmlWriter)将会写入一个声明, 除非XmlWriter已经被指示不使用
  • ToString方法永远不会处理XML声明

当你构造XmlWriter的时候, 你可以通过设置XmlWriterSettings对象上的OmitXmlDeclaration和ConformanceLevel属性指示XmlWriter不产生一个声明

不论XML声明有没有被生成都不会对XDeclaration对象有任何的影响. XDeclaration的目的是用于XML序列化进程:

  • 指示什么样的encoding将会被使用
  • XML声明上的encoding和standalone属性将会被设为什么值

XDeclaration构造器接受3个参数, 分别对应于version, encoding和standalone属性. 以下的例子中, test.xml使用UTF-16编码:

 1: var doc = new XDocument (
 2: new XDeclaration ("1.0", "utf-16", "yes"),
 3: new XElement ("test", "data")
 4: );
 5: doc.Save ("test.xml");

不论是设置了什么值到XML version属性上它总是会被忽略: 它总是被设置为”1.0″

encoding必须是IEIF编码的其中一种, 例如”utf-16″–它将出现在XML声明中.

待续!