XmlReader与XmlWriter用法详解



ascript">ascript"> 


  XML在.NET Framework 中有着重要的作用。如:.NET Framwork 本身的配置文件和源代码文档中使用XML,SOAP、WEB服务和ADO.NET也使用XML。

  为了扩展XML,.NET Framwork包含了System.Xml命名空间。这个命名空间带有许多处理XML的类。如,XmlDocument(这是DOM实现方式)类,以及.NET为SAX提供的一种代替品(XmlReader和XmlWriter类)。

  XPath和XSLT类,System.Xml.Serialization命名空间中的类从XML文档中创建一个对象(反串行化)。

  下表是XML读取和写的类

  操作XML有两个方法

  一、使用MSXML

  MSXML 是XML的分析器,MSXML是一个基于COM的组件,所以需要创建交互操作的程序集。最简单的方法就是在VS 中添加这个COM组件(Microsoft XML,v4.0(或v3.0,v2.6))的引用。这时在引用那一栏中就会出现MSXML2(在导入COM组件是时,为了新程序集提供的命名空间是该COM组件的类型库名)。

  二、使用System.Xml类

  与msxml类相比,System.Xml类有几个优点。首先,System.Xml是托管代码,使用它可以确保所有的代码都获得安全保护和类型安全性。使用COM交互操作会增加一些开销,但最重要的是,System.Xml命名空间很容易使用,灵活性非常大。

  读写流格式的XML

  XmlReader提供内存要求不是很高,提供了一种非常迅速、只向前的只读光标来处理XML数据。

  XmlWriter可以生成XML文档。

  XmlReader和XmlWriter都是抽象类。

  派生于XmlReader的类有XmlNodeReader(把XmlNode作为其源,而不是一个流)、XmlValidatingReader(XmlValidatingReader添加了DTD和模式验证,提供数据的有效性验证)、XmlTextReader(与IO命名空间中的TextReader对象一起使用)

  XmlTextWriter(与IO命名空间中TextWriter对象一起使用)

  1.XmlReader类

  XmlReader非常类似于SAX。它们最大的区别是SAX是一种推模型(所有XML数据都必须由应用程序 处理,无论是否需要这些数据),XmlReader是一种拉模型(如果不需要所有的数据,就不需要处理它们)。

  如下代码:

richTextBox1.Clear();
XmlReader rdr = XmlReader.Create("book.xml");
while (rdr.Read())
{
if (rdr.NodeType == XmlNodeType.Text)
richTextBox1.AppendText(rdr.Value+"rn");
}

  (1)使用静态方法Create(),返回一个XmlReader对象。

  (2)Read()方法可以进入下一个节点。

  XmlReader类还可以读取强类型化的数据,它有几个ReadValuesAs方法,如、ReadValueAsDouble、ReadValueAsBoolean等。


  检索属性数据

  AttributeCountry属性确定属性个数。GetAttribute()方法按照名称或索引来获取属性,如果要一次迭代一个属性就可以使用MoveToFirstAttribute()和MoveToNextAttribute()方法。

  如下代码:

richTextBox1.Clear();
XmlReader tr = XmlReader.Create("book.xml");
while (tr.Read())
{
if (tr.NodeType == XmlNodeType.Element)
{
for (int i = 0; i < tr.AttributeCount; i++)
{
richTextBox1.AppendText(tr.GetAttribute(i)+"rn");
}
}
}

  使用XmlReader类进行验证

  有时不但要知道文档的格式是规范的,还是确定文档是有效的。

  XmlReader可以使用XmlReaderSettings,根据XSD模式验证XML。XSD模式添加到XMLSchemaSet中,通过Schema属性可以访问XMLSchemaSet。XsdValidate属性还必须设置为ture,这个属性默认为flase.

       2.XmlWriter类

  XmlWriter类可以把Xml写入一个流、文件、StringBuilder、TextWriter或另一个XmlWriter对象中。与XmlReader一样,XmlWriter类以只向前、未缓存的方式 进行写入。

  使用XmlWirterSettings对旬进行是否缩进文本、缩进量等配置。

  如下代码:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true; //是否缩进
settings.NewLineOnAttributes = true;  //把每个属性写在一行,这样做可以更容易读取XML
XmlWriter writer = XmlWriter.Create("booknew.xml",settings);
writer.WriteStartDocument();//文档开始,会在文件第一行写入“<?xml version="1.0" encoding="utf-8"?>
writer.WriteStartElement("book");//写入第一个元素节点,会作为根节点
writer.WriteAttributeString("genre","Mystery");//根节点第一个属性的属性名以及属性值
writer.WriteAttributeString("publicationdate","2001");//第二个属性
writer.WriteAttributeString("ISBN","123456489");//第三个属性
writer.WriteElementString("title","Case of the Money");//一个新的元素节点,给出了Text的内容,位于根节点下,并且已结束
writer.WriteStartElement("author");//写入一个新的元素节点
writer.WriteElementString("name","Cookie Monster");//该新元素节点下,又一个新的元素节点,并且结束
writer.WriteEndElement();//该新元素节点结束(就近原则)
writer.WriteElementString("price","9.99");//一个新的节点元素

writer.WriteEndElement();//根节点结束,可省略~       

writer.WriteEndDocument();//文档结束
writer.Flush();
writer.Close();

结果:

<?xml version="1.0" encoding="utf-8"?>
<book
  genre="Mystery"//属性分行
  publicationdate="2001"
  ISBN="123456489">
  <title>Case of the Money</title>
  <author>
    <name>Cookie Monster</name>
  </author>
  <price>9.99</price>
</book>

  1.使用XmlWriterSettings实例对象进行生成的XML的设置。

  2.使用Create(),返回一个XmlWriter对象,其中Create(),第一个参数为Xml的名字,第二个参数为XmlWriterSettings实例对象。

  3.使用WriterStartDocument()中文档声明,开始写入数据,以WriteEndDocument()结束。注间控制元素的嵌套,注意WriterStartElement()和WriterEndElement()的调用与位置。

  4.还有一些专用的写入方法。WriteCData()可以输出一个CData部分(),WriterComment()以正确的XML格式写
 
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值