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

(0)

相关推荐

  • C#中如何使用 XmlReader 读取XML文件

    XmlReader通过向前读取文档并识别读取到的元素,为我们提供了一种消耗资源最少的方式来解析XML数据.很多时候我们都是利用XmlReader来对XML文件的数据有效性进行验证(使用XmlReader实例的Read()方法依次读取所有节点,以此判断是否与符合指定的模式).使用这种非缓存.只读.只向前的方式,每次读取只将很少的数据放入内存,对内存的占用量较小,对于读取内容较大的XML文件不失为一种最佳的选择. 让我们看看XmlReader类读取XML文件的步骤: 1.使用XmlReader类的C

  • 基于C#中XmlReader读取Xml的深入分析

    XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存,而在有些场景下我们必须考虑尽可能节省内存.这时候就该XmlReader和XmlWriter出场了.XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false.如下读取Xml内容实例代码和注释说明 复制代码 代码如下: using System; using Sys

  • extjs DataReader、JsonReader、XmlReader的构造方法

    extjs3.0帮助文档: DataReader( Object meta, Array/Object recordType ) Create a new DataReader 参数: meta : Object Metadata configuration options (implementation-specific). 元数据配置选项(...-...) recordType : Array/Object Either an Array of Field definition object

  • PHP中使用xmlreader读取xml数据示例

    有一个XML文件,内容如下: 复制代码 代码如下: <?xml version="1.0"?>  <shows>      <show>          <name>Simpsons</name>          <channel>FOX</channel>          <start>8:00 PM</start>          <duration>30

  • ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别

    ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别      主要有这么几种,cmd.ExecuteReader();cmd.ExecuteNonQuery();cmd.ExecuteScalar();cmd.ExecuteXmlReader();) 1,ExecuteReader();返回一个SqlDataReader对象或OleDbDataReader对象,这个看你的程序的需要去 做.可以通过这个

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

    MemoryStream对象提供了无需进行IO就可以创建Stream的方法,XmlTextWriter和XmlReader提供快速书写和读取XML内容的方法,结合MemoryStream,就可以直接在内存中构造XmlTextWriter,并用XmlReader进行读取. 使用MemoryStream和XmlTextWriter进行书写XML,需要注意两点:XmlTextWriter.Flush操作和重设MemoryStream.Position = 0. C#  <%@ Page Languag

  • C#使用文件流FileStream和内存流MemoryStream操作底层字节数组byte[]

    一.Stream类概述 在.NET Framework中,文件和流是有区别的. 文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream). 但是,流不仅仅是指打开的磁盘文件,还可以是网络数据..Net Framework允许在内存中创建流.此外,在控制台应用程序中,键盘输入和文本显示都是流. 1. Stream类 Stream类是所有流的抽象基类. Stream类的主要属性有CanRead.CanWrite(是否支持读取写入).CanS

  • C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换

    定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 复制代码 代码如下: (1)byte[] bt=System.Text.Encoding.Default.GetBytes("字符串"); (2)byte[] bt=Convert.FromBase64String("字符串"); 2.字符串转流 复制代码 代码如下: (1)MemoryStream ms=new MemoryStream(System.Text.Encoding.

  • SpringBoot拦截器读取流后不能再读取的问题

    目录 解决这个问题我能想到两种方式 第一种方法 第二种方法 在SpringBoot的拦截器中通过流 ( request.getInputStream() ) 的方式读取body中传来的数据会导致controller接收不到值. 这个问题其实就是一个流读取的问题,众所周知在Java中input流只能读取一次,主要原因是通标记的方法来判断流是否读取完毕(读取位 -1就是流读取完毕) 解决这个问题我能想到两种方式 1.通过修改标记的方式 ( inputstream.markSupported() 方法

  • 完美解决java读取大文件内存溢出的问题

    1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 实际上是使用BufferedReader或者其子类LineNumberReader来读取的. 传统方式的问题: 是文件的所有行都被存放在内存中,当文件足够大时很快就会

  • Golang 实现分片读取http超大文件流和并发控制

    分片读取http超大文件流 Golang中的HTTP发送get请求,在获取内容有两种情况. Golang发送http get请求方式 resp, err := http.Get(sendUrl) if err != nil { fmt.Println("出错", err) return } 第一种方式是直接全部读取出来,这种方式在小数据量的时候很方便. body变量直接全部接收resp响应内容 body, err2 := ioutil.ReadAll(resp.Body) 第二种方式,

  • python cv2读取rtsp实时码流按时生成连续视频文件方式

    我就废话不多说了,直接上代码吧! # coding: utf-8 import datetime import cv2 import os ip = '192.168.3.160'.replace(".", "_") rtsp = 'rtsp://admin:admin@192.168.3.160:554/1/1' # 初始化摄像头 cap = cv2.VideoCapture(rtsp) fourcc = cv2.VideoWriter_fourcc(*'XVID

  • Java基础字符编码与内存流详细解读

    目录 1.字符编码 1.1 常用字符编码 1.2 乱码产生分析 2.内存流基本操作 3.打印流 3.1 格式化文本信息 4. System类 4.1 系统输出 4.2 系统输出 4.3 系统输入 5.BufferedReader类 6.Scanner 7.对象序列化 7.1 对象序列化的概念 7.2 实现序列化和反序列化 7.3 transient关键字(了解) 1.字符编码 1.1 常用字符编码 在计算机的世界之中,所有的显示文字都是按照其指定的数字编码进行保存的,如果没有正确的解码,那么就坑

  • 关于Poi读取Excel引发内存溢出问题的解决方法

    前言 最近生产环境有个老项目一直内存报警,不时的还出现内存泄漏,导致需要重启服务器,已经严重影响正常服务了. 分析 1.dump内存文件 liunx使用如下命令: ./jmap -dump:format=b,file=heap.hprof pid 2.使用Eclipse Memory Analysis进行分析 异常如下: at org.apache.poi.xssf.usermodel.XSSFRow.<init>(Lorg/openxmlformats/schemas/spreadsheet

  • c++实现逐行读取配置文件写入内存的示例

    不解析配置内容,只读取文件内容,剪去注释和首尾空格后写入缓存: vector<string> 中.供其他方法使用.代码是在做一个MFC小工具时写的. ReadProtocol.h 复制代码 代码如下: /*** 从文件中 读取 protocol 的内容 写入缓存* 供外部方法使用* Alex Liu, 2014*/ #pragma once #include <vector>#include <map>#include <list>#include <

随机推荐