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

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

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);

}

   }

 

好了,由于时间关系,先写到这儿。以后我会在适当的时候推出本文详细的版本,希望各位留意。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值