您的位置:首页 > 其它

.NET中用于处理XML的方法和相关类

2003-12-08 12:03 399 查看
本文是本人研读《.NET XML高级编程》时的一些感想和体会,希望对想进行.NET XML编程的初级读者有用。
 
对于使用.NET进行XML编程的朋友们们来说,不知你们有没有这样的感觉:.NET虽然内嵌了不少用于处理XML的类和方法,如:XmlReader,XmlWriter,XmlDocument,XPathDocument,XPathNavigator,XslTransfrom以及作为COM组件提供的DOMDocument。但每每真正进行XML编程的时候总是感觉无从下手,到底这些类都是干什么的,是都要用呢还是只需要用哪一些就可能了并且如何用。所以虽然对于.net提供的处理XML的强大功能,也只能望而却步。好了,有了这篇文章,你会对.net中的XML的使用有一个清淅的认识和理解,我想这点对你来说应该足够了。
 
总的来说,在.NET中处理XML的方法可以分为XML托管类和COM组件两大类:
1、  使用XML托管类<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

XML托管类又分为由.NET全新实现的基于流的API和基于传统的DOM编程模型的API两类,这两类都位于System.Xml程序集中。该程序集包含直接处理XML文档的对象(其中既包括仅前向的非缓存的访问对象(与SAX类似),又包括将整个文档加载到内存的随机访问对象(类似于文档对象模型DOM)),以及包括一些助手类(如用于改进MS的XML分析器性能的名称表类等)。
A、由.NET全新实现的基于流的API(XmlReader与XmlWriter)

它们是使用一个流型I/O模型(仅前向的非缓存的访问模型)。XmlReader用于处理XML文档,而XmlWriter用于产生XML文档(串行化)。它们成为替代传统DOM方法(见B)的极好方法,因为流型模型不需要高代价的内存缓存。
XmlReader提供了可以用来在文档中进行导航的方法(主要是逐个节点访问的方法和一些用于快速导航的助手方法),同时还提供了可以读取当前节点信息的方法。
 

// 示例程序:使用XmlReader类从XML文件中读取一个XML流
using System;
using System.Xml;
 

class Class1
{
   static void Main(string[] args)
   {
      XmlTextReader reader = null;
      int iCount = 0;
      try
      {
         reader = new XmlTextReader(@"c:/1.xml");
         while (reader.Read())
         {
            if (reader.NodeType == XmlNodeType.Element)
            iCount++;
         }
         Console.Write("Total {0} Elements found!", iCount);
      }
      finally
      {
         if (reader != null)
         reader.Close();
      }
   }
}
 

// 示例程序:使用XmlWriter类逐个节点地来创建格式正确的XML文档
using System;
using System.Xml;
 

class Class1
{
   static void Main(string[] args)
   {
      XmlTextWriter writer = new XmlTextWriter(Console.Out);
      writer.Formatting = Formatting.Indented;
 

      writer.WriteStartDocument();
 

      writer.WriteStartElement("Person");
      writer.WriteAttributeString("Sex", "Male");
      writer.WriteAttributeString("FirstName", "Sunny");
      writer.WriteAttributeString("LastName", "Bajaj");
      writer.WriteElementString("Phone", "111-111-1111");
      writer.WriteElementString("Phone", "222-222-2222");
      writer.WriteEndElement();
 

      writer.WriteEndDocument();
 

      writer.Flush();
      writer.Close();
   }
}
B、基于传统的DOM编程模型的API(DOM、XPath、XSLT)

I、DOM

使用DOM API,整个XML文档将被加载到内存(缓存),API允许对内存XML文档进行导航和编辑,可以用DOM来创建一个XML文档,然后将它保存到一个文件,或将它发送到一个流中等。在.NET中,DOM的加载机制是建立在XmlReader类上的,而DOM串行化是建立在XmlWriter类上的。核心的类是XmlDocument(它等价于COM组件中的MSXML DOMDocument伴随类,两者的用法也很相似),它的重要方法是Load()和LoadXML()方法。
II、XPath

在.NET中,XPath命名空间支持文档导航。XPath的功能是通过XPathNavigator类来实现的。
 

// 示例程序:演示XPath的用法
// c:/1.xml
<?xml version="1.0" encoding="IBM437"?>
<Person Sex="Male" FirstName="Sunny" LastName="Bajaj">
   <Phone>111-111-1111</Phone>
   <Phone>222-222-2222</Phone>
</Person>
 

using System;
using System.Xml.XPath;
class Class1
{
   static void Main(string[] args)
   {
      XPathDocument doc = new XPathDocument(@"c:/1.xml");
      XPathNavigator nav = doc.CreateNavigator();
      XPathNodeIterator iter = nav.Select("/Person/Phone");
 

      while (iter.MoveNext())
      {
         Console.WriteLine("Phone: {0}", iter.Current.Value);
      }
   }
}
 

III、XSLT转换
用于将XML从一种格式转换为另一种格式。核心类是XslTransform,该类的重要方法是Load()和Transform()。
 

// 示例程序:将c:/1.xml使用c:/1.xsl转换成另一种XML并输出
// c:/1.xsl文件
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 

   <xsl:output indent="yes" method="xml" />
   <xsl:template match="Person">
      <Person>
         <Sex><xsl:value-of select="@Sex" /></Sex>
         <FName><xsl:value-of select="@FirstName" /></FName>
         <LName><xsl:value-of select="@LastName" /></LName>
      </Person>
   </xsl:template>
 

   <xsl:template match="/">
      <xsl:apply-templates />
   </xsl:template>
 

</xsl:stylesheet>
 

// XslTransformExample.cs
using System;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;
 

class Class1
{
   static void Main(string[] args)
   {
      //load input document
      XmlDocument doc = new XmlDataDocument();
      doc.Load(@"c:/1.xml");
      XPathNavigator nav = doc.CreateNavigator();
 

      //Load XSLT document
      XslTransform docXSL = new XslTransform();
      docXSL.Load(@"c:/1.xsl");
 

      //Apply transformation and send output to console
      docXSL.Transform(nav, null, Console.Out);
   }
}
 

如果正在编写ASP.NET Web应用程序,且需要显示一个XML文档或者需要用服务器端XML样式表(即.xsl文件)对一个XML文档进行转换,这可能需要使用XML Web服务器控件<asp:Xml…>
二、使用COM组件(COM互操作)

   当在.NET中处理XML时,应尽量使用System.Xml程序集中的XML类,而不要通过COM的互操作性来使用MSXML。
   假设最新版本的MSXML提供了一些.NET XML托管类(即System.Xml程序集)所不支持的功能,这时我们就有必要在.NET应用程序中通过COM互操作性的机制来使用MSXML了。它位于COM选项卡中的Microsoft XML Parser MSXML 3.0。
   // 示例程序:使用MSXML
   using System;
   using MSXML2;
 

   class Class1
   {
static void Main(string[] args)
{
   DOMDocument30 doc = new DOMDocument30();
   doc.load(@”c:/books.xml”);
   Console.Write(doc.xml);
}
   }
 
好了,由于时间关系,先写到这儿。以后我会在适当的时候推出本文详细的版本,希望各位留意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息