XmlReader 读取器读取内存流 MemoryStream 的注意事项

MemoryStream对象提供了无需进行IO就可以创建Stream的方法,XmlTextWriter和XmlReader提供快速书写和读取XML内容的方法,结合MemoryStream,就可以直接在内存中构造XmlTextWriter,并用XmlReader进行读取。 

使用MemoryStream和XmlTextWriter进行书写XML,需要注意两点:XmlTextWriter.Flush操作和重设MemoryStream.Position = 0。 

C# 

<%@ Page Language="C#"%> 

<%@ Import Namespace="System.Xml" %> 

<%@ Import Namespace="System.IO" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<script runat="server"> 

protected void Button1_Click(object sender, EventArgs e) 

Response.Clear(); 

Response.ContentType = "text/xml"; 

MemoryStream msXml = new MemoryStream(); 

XmlTextWriter xmlWriter = new XmlTextWriter(msXml, Encoding.UTF8); 

xmlWriter.WriteStartElement("rss"); 

xmlWriter.WriteAttributeString("version", "2.0"); 

xmlWriter.WriteStartElement("channel"); 

xmlWriter.WriteElementString("title", "【孟宪会之精彩世界】"); 

xmlWriter.WriteElementString("link", "http://dotnet.aspx.cc/Rss.aspx"); 

xmlWriter.WriteElementString("description", "NET开发技术。"); 

xmlWriter.WriteElementString("language", "zh-CN"); 

xmlWriter.WriteElementString("copyright", "Copyright 1999-2007【孟宪会之精彩世界】"); 

xmlWriter.WriteElementString("managingEditor", "amxh[AT]21cn.com"); 

xmlWriter.WriteStartElement("image"); 

xmlWriter.WriteElementString("title", "【孟宪会之精彩世界】"); 

xmlWriter.WriteElementString("width", "144"); 

xmlWriter.WriteElementString("height", "35"); 

xmlWriter.WriteElementString("link", "http://dotnet.aspx.cc/"); 

xmlWriter.WriteElementString("url", "http://dotnet.aspx.cc/Images/LogoRss.gif"); 

xmlWriter.WriteEndElement(); 

//循环读出数据库内容列表,忽略 

//while (objReader.Read()) 

//{ 

// xmlWriter.WriteStartElement("item"); 

// xmlWriter.WriteElementString("title", objReader.GetString(0)); 

// xmlWriter.WriteElementString("description", objReader.GetString(1)); 

// xmlWriter.WriteElementString("link", "http://dotnet.aspx.cc/article/a933b187-06c3-4263-9eec-414a54d9c815/read.aspx"); 

// xmlWriter.WriteElementString("pubDate", objReader.GetDateTime(3).ToString("G")); 

// xmlWriter.WriteEndElement(); 

//} 

//objReader.Close(); 

xmlWriter.WriteStartElement("item"); 

xmlWriter.WriteElementString("title", "ASP.NET 2.0中直接将Access数据库导入到Excel文件中"); 

xmlWriter.WriteElementString("description", "ASP.NET 2.0中直接将Access数据库导入到Excel文件中"); 

xmlWriter.WriteElementString("link", "http://dotnet.aspx.cc/article/a933b187-06c3-4263-9eec-414a54d9c815/read.aspx"); 

xmlWriter.WriteElementString("pubDate", "Sat, 02 Dec 2006 09:39:58 GMT"); 

xmlWriter.WriteEndElement(); 

xmlWriter.WriteEndElement(); 

xmlWriter.WriteEndElement(); 

xmlWriter.Flush(); // 确保书写器更新到Stream中; 

msXml.Position = 0; // 重置流的位置,以便我们可以从头读取 

XmlReader xmlReader = XmlReader.Create(msXml); 

while (xmlReader.Read()) 

if (xmlReader.Name == "rss") 

Response.Write(xmlReader.ReadOuterXml()); 

Response.End(); 

msXml.Close(); 

xmlWriter.Close(); 

xmlReader.Close(); 

</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head runat="server"> 

<title>XmlReader 读取器读取内存流 MemoryStream 的注意事项</title> 

</head> 

<body> 

<form id="form1" runat="server"> 

<asp:Button id="Button1" runat="server" OnClick="Button1_Click" Text="读取数据" /> 

</form> 

</body> 

</html> 

VB.NET 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) 

Response.Clear 

Response.ContentType = "text/xml" 

Dim msXml As MemoryStream = New MemoryStream 

Dim xmlWriter As XmlTextWriter = New XmlTextWriter(msXml, Encoding.UTF8) 

xmlWriter.WriteStartElement("rss") 

xmlWriter.WriteAttributeString("version", "2.0") 

xmlWriter.WriteStartElement("channel") 

xmlWriter.WriteElementString("title", "【孟宪会之精彩世界】") 

xmlWriter.WriteElementString("link", "http://dotnet.aspx.cc/Rss.aspx") 

xmlWriter.WriteElementString("description", "NET开发技术。") 

xmlWriter.WriteElementString("language", "zh-CN") 

xmlWriter.WriteElementString("copyright", "Copyright 1999-2007【孟宪会之精彩世界】") 

xmlWriter.WriteElementString("managingEditor", "amxh[AT]21cn.com") 

xmlWriter.WriteStartElement("image") 

xmlWriter.WriteElementString("title", "【孟宪会之精彩世界】") 

xmlWriter.WriteElementString("width", "144") 

xmlWriter.WriteElementString("height", "35") 

xmlWriter.WriteElementString("link", "http://dotnet.aspx.cc/") 

xmlWriter.WriteElementString("url", "http://dotnet.aspx.cc/Images/LogoRss.gif") 

xmlWriter.WriteEndElement 

xmlWriter.WriteStartElement("item") 

xmlWriter.WriteElementString("title", "ASP.NET 2.0中直接将Access数据库导入到Excel文件中") 

xmlWriter.WriteElementString("description", "ASP.NET 2.0中直接将Access数据库导入到Excel文件中") 

xmlWriter.WriteElementString("link", "http://dotnet.aspx.cc/article/a933b187-06c3-4263-9eec-414a54d9c815/read.aspx") 

xmlWriter.WriteElementString("pubDate", "Sat, 02 Dec 2006 09:39:58 GMT") 

xmlWriter.WriteEndElement 

xmlWriter.WriteEndElement 

xmlWriter.WriteEndElement 

xmlWriter.Flush 

msXml.Position = 0 

Dim xmlReader As XmlReader = XmlReader.Create(msXml) 

While xmlReader.Read 

If xmlReader.Name = "rss" Then 

Response.Write(xmlReader.ReadOuterXml) 

End If 

End While 

Response.End 

msXml.Close 

xmlWriter.Close 

xmlReader.Close 

End Sub 

相关推荐