转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
在.NETFramework中表示XML的最佳做法         ★★★★

在.NETFramework中表示XML的最佳做法

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1880 更新时间:2009/4/23 11:18:14
     Dare Obasanjo
  
  Microsoft Corporation
  
  摘要:Dare Obasanjo 着眼于可用来表示在单个进程和 AppDomain 内的组件之间共享的、基于 XML 的数据的选项,并讨论了每种方法在设计上的利弊。
  
  引言
  在最近的一次设计审查之后,一名职位是项目经理的同事询问在 API 中公开 XML 时是否存在设计准则,因为他曾经看到过许多不同的方法,但是无法确定该选择何种方法。我告诉他,我原来相信在 MSDN 上可以找到一些准则,但是当我查阅时却只找到一段标题为 Passing XML Data Inside the CLR(英文)的 MSDN TV,其中虽然包含此类信息,但却不容易阅读。因此我萌发了这样一个念头,即为 Don Box 的 MSDN TV 片段提供一个便于打印的版本,并提供我本人在 Microsoft 处理 XML API 方面的一些经验。
  
  返回页首
  准则初探
  在三种主要情况下,开发人员需要考虑使用何种 API 来表示 XML。下面简要介绍一下这些情况和准则:
  
  • 类的字段或属性中包含 XML:如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。
  
  • 方法可以接受 XML 输入或返回 XML 作为输出:可以接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。
  
  • 将对象转换成 XML:如果对象出于序列化目的要以 XML 来表示其自身,当其需要获得的 XML 序列化进程控制比 XmlSerializer 所提供的更多时,则应使用 XmlWriter。如果对象要以 XML 来表示其自身,以便能够完全以 XML 世界成员的身份参与到其中(如允许在此对象上进行 XPath 查询或 XSLT 转换),则此对象应实现 IXPathNavigable 接口。
  
  
  在下面各部分中,我详细介绍了上面提到的几种情况,并解释了我是如何获得这些准则的。
  
  返回页首
  常见疑点
  当您决定使用方法或属性接受或返回 XML 时,您的大脑中会出现 .NET Framework 中的许多类,它们都适用于此任务。下面列出了 .NET Framework 中最适合于表示 XML 输入或输出的五个类,并且给出了其正反两方面的简要说明。
  
  1.
   System.Xml.XmlReader(英文):XmlReader 是 .NET Framework 的拉模型 XML 分析程序。在拉模型处理过程中,XML 用户通过根据需要从 XML 制造者那里请求事件来控制程序流。拉模型 XML 分析程序(如 XmlReader)以只进的流方式进行操作,同时只显示单个节点在任意给定时间的相关信息。事实上,XmlReader 不需要整个 XML 文档加载到内存并且是只读的,这使其成为以非 XML 数据源创建 XML 外观的一个不错选择。这种以非 XML 数据源创建 XML 外观的一个示例是 XmlCsvReader(英文)。有人可能将 XmlReader 的只进特性视为一种局限性,因为它使用户无法通过 XML 文档的各个部分进行多次传递。
  
  2.
   System.Xml.XPath.XPathNavigator(英文):XPathNavigator 是 XML 数据源上的只读光标。XML 光标就像是一个透镜,一次聚焦于一个 XML 节点上,但与基于拉的 API(如 XmlReader)不同,它可以在任意给定时间将光标定位在 XML 文档的任意位置。在某种程度上,拉模型 API 是光标模型的只进版本。XPathNavigator 还是以非 XML 数据实现 XML 外观的一个很好的候选项,因为它允许您以实时方式构造数据源的 XML 视图,而不必将整个数据源转换成 XML 树。使用 XPathNavigator 创建非 XML 数据的 XML 视图的一个示例是 ObjectXPathNavigator(英文)。事实上,XPathNavigator 是只读的,而且缺少一些用户友好属性(如 InnerXml(英文)和 OuterXml(英文)),这使其在需要这些功能时不如使用 XmlDocument 或 XmlNode 那样另人满意。
  
  3.
   System.Xml.XmlWriter(英文):XmlWriter 提供了将 XML 文档推入基本存储区的一般机制。该基本存储区可以是从文件(如果使用的是 XmlTextWriter)到 XmlDocument(如果使用的是 XmlNodeWriter(英文))的任何内容。使用 XmlWriter 作为返回 XML 的方法的参数为支持各种可能的返回类型(包括文件流、字符串和 XmlDocument 实例)提供了一种可靠方式。这就是为什么 XmlSerializer.Serialize() method(英文)接受 XmlWriter 作为其中一个重载上的参数。正如其名称所包含的意思,XmlWriter 只对编写 XML 有用,不能用于读取或处理 XML。
  
  4.
   System.Xml.XmlDocument/XmlNode(英文):XmlDocument 是 W3C Document Object Model (DOM)(英文)的实现。DOM 是由 XmlNode 对象的分层树所构成的 XML 文档在内存中的表示,这些对象代表 XML 文档的逻辑组件,如元素、属性和文本节点。DOM 是在 .NET Framework 中操作 XML 的最流行的 API,因为它提供了一种直接的方法来加载、处理和保存 XML 文档。DOM 的主要缺陷是其设计需要将整个 XML 文档加载到内存中。
  
  5.
   System.String(英文):XML 是一种基于文本的格式,而且比 String 类能更好地表示文本。使用字符串作为 XML 表示方法的主要优点在于字符串是最小公分母。字符串容易写入日志文件或打印到控制台,而且如果您要使用 XML API 对 XML 进行实际处理,则可以将字符串加载到 XmlDocument 或 XPathDocument 中。使用字符串作为利用 XML 的方法或属性的主要输入或输出存在几个问题。使用字符串的第一个问题类似于 DOM,它们都需要将整个 XML 文档加载到内存中。其次,以字符串表示 XML 会增加制造者生成 XML 字符串的负担,在某些情况下这可能非常麻烦。生成 XML 字符串可能非常麻烦的一个示例就是从 XmlReader 或 XPathNavigator 获得 XML 时。第三,以字符串表示 XML 可能会导致与字符编码相关的混乱,因为无论在 XML 中放入什么编码声明,.NET Framework 中的字符串始终是 UTF-16 字符编码。最后,以字符串表示 XML 使得创建 XML 处理管道较为困难,因为管道中的每一层都必须重新分析文档。
  
  
  返回页首
  类的字段或属性中包含 XML
  在某些情况下,对象的字段或属性可能是一个 XML 文档或 XML 片段。下面的示例类代表一封电子邮件,其内容是 XHTML。邮件的 XML 内容是以字符串表示的,并且由该类的 Body 属性公开:
  
  public class Email{
   private string from;
   public string From{
   get { return from; }
   set {from = value; }
   }
   private string to;
   public string To{
   get { return to; }
   set {to = value; }
   }
   private string subject;
   public string Subject{
   get { return subject; }
   set {subject = value; }
   }
   private DateTime sent;
   public DateTime Sent{
   get { return sent; }
   set {sent = value; }
   }
   private XmlDocument body = new XmlDocument();
   public string Body{
   get { return body.OuterXml; }
   set { body.Load(new System.IO.StringReader(value));}
   }
  }
  
  使用字符串作为表示 XML 文档的字段或属性的主要表示方式是最具用户友好性的表示方式,因为 System.String 类是一般开发人员最熟悉的 XML“常见疑点”。但是,这将会增加使用该类的用户的负担,这些用户现在可能必须应付两次分析 XML 文档的成本。例如,设想一种情况:在从 SqlCommand.ExecuteXmlReader() method(英文)或 XslTransform.Transform() method(英文)所得到的 XML 中设置了这样一个属性。在这种情况下,用户将必须分析文档两次,如下例所示:
  
   Email email = new Email();
   email.From = "dareo@example.com";
   email.To = "michealb@example.org";
   email.Subject = "Hello World";
  
   XslTransform transform = new XslTransform();
   transform.Load("format-body.xsl");
  
   XmlDocument body = new XmlDocument();
   //1. XML 由 XmlDocument.Load() 分析
   body.Load(transform.Transform(new XPathDocument("body.xml"), null));
  
   //2. 同一 XML 被 Email.Body 属性中的 XmlDocument.Load() 再次分析
  email.Body = body.OuterXml;
  
  在上例中,同一 XML 被分析了两次,因为在将该 XML 转换成字符串之前必须将其从 XmlReader 加载到 XmlDocument 中,然后使用该 XML 设置 Email 类的 Body 属性,再由该属性本身从内部将该 XML 分析为 XmlDocument。一条很有效的经验法则就是提供对 XML 属性的访问(作为 XmlReader 和字符串)。因此,还应将下列方法添加到 Email 类,以使该类的用户获得最大的灵活性:
  
  public void SetBody(XmlReader reader){
   body.Load(reader);
   }
  
   public XmlReader GetBody(){
   return new XmlNodeReader(body);
   }
  
  这为 Email 类的用户提供了一种方式,使这些用户在需要时能够以有效的方式传递、设置和检索 Body 属性中的 XML 数据。
  
  准则 如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。
  
  敏锐的读者可能会注意到,如果您直接将 XmlDocument 作为属性公开,则应满足该准则,还应使该属性的用户可以精确更改 XML。
  
  返回页首
  方法可以接受 XML 输入或者返回 XML 作为输出
  当设计生成或使用 XML 的方法时,开发人员有责任使这样的方法在接受输入时具有灵活性。当方法接受 XML 作为输入时,您可以将这些方法分为要求在适当位置修改数据的方法,以及只需对 XML 进行只读访问的方法。唯一一个支持读写访问的“XML 常见疑点”是 XmlDocument。下面的代码示例显示了这样一个方法:
  
  public void ApplyDiscount(XmlDocument priceList){
   foreach(XmlElement price in priceList.SelectNodes("//price")){
   price.InnerText = (Double.Parse(price.InnerText) * 0.85).ToString();
   }
   }
  
  对于需要对 XML 进行只读访问的方法,有两个主要选项:
  
  • XmlReader
  
  • XPathNavigator
  
  
  XmlReader 提供了对 XML 的只进访问,而 XPathNavigator 不但提供了对基本 XML 源的随机访问,还提供了对数据源执行 XPath 查询的能力。以下代码示例将打印下面的 XML 文档中的 artist(艺术家)和 title(标题):
  
  <items>
   <compact-disc>
   <price>16.95</price>
   <artist>Nelly</artist>
   <title>Nellyville</title>
   </compact-disc>
   <compact-disc>
   <price>17.55</price>
   <artist>Baby D</artist>
   <title>Lil Chopper Toy</title>
   </compact-disc>
   </items>
  
  XmlReader:
  
  public static void PrintArtistAndPrice(XmlReader reader){
   reader.MoveToContent(); //move from root node to document element (items)
   /* 保持读取,直至获得第一个 <artist> 元素 */
   while(reader.Read()){
  
   if((reader.NodeType == XmlNodeType.Element) && reader.Name.Equals("artist")){
  
   artist = reader.ReadElementString();
   title = reader.ReadElementString();
   break;
   }
   }
   Console.WriteLine("Artist={0}, Title={1}", artist, title);
   }
  }
  
  XPathNavigator:
  
  public static void PrintArtistAndPrice(XPathNavigator nav){
  
   XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist
   | /items/compact-disc[1]/title");
  
   iterator.MoveNext();
   Console.WriteLine("Artist={0}", iterator.Current);
  
   iterator.MoveNext();
   Console.WriteLine("Title={0}", iterator.Current);
   }
  
  通常,返回 XML 的方法都使用类似的规则。如果希望接收方编辑 XML,则应返回 XmlDocument。否则,应根据方法是否需要提供对 XML 数据的只进流式访问而返回 XmlReader 或 XPathNavigator。
  
  准则 接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。
  
  上述准则的意思是指返回 XML 的方法应有助于返回 XmlReader,因为它比其他任何类型都适用于更多用户的情况。此外,当方法的调用方需要更多功能时,它们可以从返回的 XmlReader 加载 XmlDocument 或 XPathD

[1] [2]  下一页


[Web开发]XML与HTML在语法上的主要区别详解  [系统软件]如何让Expat支持中文XML
[VB.NET程序]vb.net 与 XML 的操作  [VB.NET程序]vb.net读写xml(2)--实现datagrid与xml的沟通(原创…
[VB.NET程序]vb.net 读写xml方法(1)  [VB.NET程序][VB.NET+XML]完成简单程序配置
[VB.NET程序]使用Visual Basic操纵XML文档  [VB.NET程序]XML 简单接口 (SAX2)用Visual Basic 实现的示例
[Delphi程序]Delphi 6 XML映象工具  [Delphi程序]Delphi 6 XML数据绑定
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台