使用XmlTextReader 读取XML

XmlTextReader 限于只向前的读取
XmlTextReader 的技术类似于读取其他任何文件 首先打开文件,然后从文件中读取信息,最后关闭文件.
每次从文件中读取信息时,他在文件中的位置都会前移.到达文件结尾的时候就什么都不读了。
1 创建XmlTextReader对象
    XmlTextReader 类:表示提供对 XML 数据进行快速、非缓存、只进访问的读取器。
    public class XmlTextReader : XmlReader, IXmlLineInfo
 例如:创建一个名为myReader的对象,并将他指向一个filename文件.这个文件名可以包含完整的路径
 XmlTextReader myReader=new XmlTextReader("filename");
 XmlTextReader 构造函数:1 protected XmlTextReader();   2 public XmlTextReader(Stream);
                        3 public XmlTextReader(string);等等
 读取数据:
 注意:XmlTextReader 对象不验证数据。它假设你已经使用了标准的XML。(缺乏数据验证有助于获取最快的速度)
 读取数据的XMLTextReader方法
 方法                                    详细说明
 Read                                    读取XML文件的下一个结点
 ReadAttributeValue                      读取属性值
 ReadBase64                              读取Base64值
 ReadBinHex                              读取BinHex值
 ReadChars                               读取文本字符
 ReadElementString                       读取只有文本的元素
 ReadEndElement                          读取结束元素
 ReadInnerXml                            将XML结点全部内容读到一个字符串里面
 ReadOuterXml                            将整个XML结点和它的内容读到一个字符串里面
 ReadStartElement                        读取开始元素
 ReadString                              将一个元素或者文本结点值读到一个字符串里面
 注意XmlNodeType对象读取的值与一个XmlNodeType的值相比较完成评估 (详见 msdn)
 关闭XmlTextReader对象 myReader.Close();
 使用XmlTextReader的实例应用程序
 实例说明:
 使用XmlTextReader读取XML文件 
 
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Xml;
using System.Text;
//
namespace Xmlapp2
public class Form1 : System.Windows.Forms.Form
    
{
//
  private XmlTextReader  xtr=null;
    
public Form1()
        
{
            
//
            
// Windows 窗体设计器支持所必需的
            
//
            InitializeComponent();
            xtr
=new XmlTextReader(@"temp.xml");
            
//XmlTextReader.WhitespaceHandling 属性 :获取或设置一个值,该值指定如何处理空白
            xtr.WhitespaceHandling=WhitespaceHandling.All;
            
//
            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            
//
        }

//
        private void button2_Click(object sender, System.EventArgs e)//关闭退出
        {
            
if (xtr!=null)
            
{
                xtr.Close();
            }

            Application.Exit();
        }

        
private void button1_Click(object sender, System.EventArgs e)
        
{
            StringBuilder str
=new StringBuilder("Formatted:");
            
if (xtr.Read()==true)
            
{
                label1.Text
=xtr.NodeType.ToString();
                label2.Text
=xtr.Name.ToString();
                label3.Text
=xtr.Value.ToString();
                
                
switch (xtr.NodeType)
                
{
                    
case XmlNodeType.Element:
                        str.AppendFormat(
"<{0}>",xtr.Name);
                        
break;
                    
case XmlNodeType.Text:
                        
break;
                    
case XmlNodeType.CDATA:
                        str.AppendFormat(
"<![CDATA[{0}]]>",xtr.Value);
                        
break;
                    
case XmlNodeType.ProcessingInstruction:
                        str.AppendFormat(
"<?{0} {1}?>",xtr.Name,xtr.Value);
                        
break;
                    
case XmlNodeType.Comment:
                        str.AppendFormat(
"<!--{0}-->",xtr.Value);
                        
break;
                    
case XmlNodeType.XmlDeclaration:
                        str.AppendFormat(
"<?xml version='1.0'?>");
                        
break;
                    
case XmlNodeType.DocumentType:
                        str.AppendFormat(
"<!DOCTYPE{0} [{1}]>",xtr.Name,xtr.Value);
                        
break;
                    
case XmlNodeType.EntityReference:
                        str.Append(xtr.Name);
                        
break;
                    
case XmlNodeType.EndElement:
                        str.AppendFormat(
"</{0}>",xtr.Name);
                        
break;
                    
case XmlNodeType.Whitespace:
                        
//Console.Write("{0}",xtr.Value);
                        break;
                }

                label4.Text
=str.ToString();

            }

            
else
            
{
                label1.Text
="Eof";
                label2.Text
="Eof";
                label3.Text
="Eof";
            }

        }


}

XmlTextReader 读取xml

01-13

xml格式:rnrn rn 5rn rn 1rn rn rn rn rn rn rn 1rn rn rn 维度rn rn 时间rn rn rn rn rn rn rn rn rn rn rn 2rn rn rn 指标rn rn 进出口商品总值rn rn 百万美元rn rn rn rn rn rn rn rnrnrnrn问题:为模板定义了一个类 Template rn public class Templatern rn protected int nStartRow;rn protected int nStartColumn;rn protected int nRowCount;rn protected int nColumnsCount;rn rnrn //起始行rn public int StartRowrn rn getrn rn return nStartRow;rn rn setrn rn nStartRow = value;rn rn rnrn //起始列rn public int StartColumnrn rn getrn rn return nStartColumn;rn rn setrn rn nStartColumn = value;rn rn rnrn //省略...rnrn public List vmode = new List();rn rnrn public class VModern rn protected int nEveryNLine;rn protected string strType;rn protected string strCode;rn protected string strUnit;rn protected string strOtherDimensions;rnrn // 值,有的是用括号或其他符号包起来的rn public string[] strValueStartEnd = new string[2];rnrn //rn public int EveryNLinern rn getrn rn return nEveryNLine;rn rn setrn rn nEveryNLine = value;rn rn rn //省略...rn rnrnrn问题:代码中 如何读取xml赋给这个类 ,大概写了一下,觉得很乱,而且有误,希望大家能给予指正。rn XmlTextReader reader = new XmlTextReader(@"***.xml");rn Template template = new Template();rn List vmodelist = null;rn while (reader.Read())rn rn if (reader.Name == "StartRow")rn rn reader.Read();rn string key = string.Empty;rn Dictionary result = new Dictionary();rn while (reader.Name != "StartRow")rn rn if (XmlNodeType.Element == reader.NodeType)rn rn key = reader.Name;rn rn else if (XmlNodeType.Text == reader.NodeType)rn rn result.Add(key, reader.Value);rn rn reader.Read();rn rn foreach (string k in result.Keys)rn rn template.StartRow = Convert.ToInt32(result[k]);rn rn rn //省略rn VMode vmode = new VMode();rn if (reader.Name == "EveryNLine")rn rn reader.Read();rn string key = string.Empty;rn Dictionary result = new Dictionary();rn while (reader.Name != "EveryNLine")rn rn if (XmlNodeType.Element == reader.NodeType)rn rn key = reader.Name;rn rn else if (XmlNodeType.Text == reader.NodeType)rn rn result.Add(key, reader.Value);rn rn reader.Read();rn rn foreach (string k in result.Keys)rn rn vmode.EveryNLine = Convert.ToInt32(result[k]);rn rn rn vmodelist.Add(vmode);rnrn

使用XmlTextReader读取不规则Xml问题,或修改Stream

07-27

最近碰到如下问题rnrn我写的程序会从其它程序那儿接收到一个MemoryStream,注意是一次接收到的没法分步读取。rn这个Stream大约在700M左右。里面的内容是几个Xml文件的内容拼在一起rn像这样:rnrn hehernrnrn haharnrn因为这种规模的数据,你没法放到XmlDocument这样的对象中去处理,如果你这样做,会发现 System.OutOfMemeoryrn所以我想要用XmlTextReader将它读出来再存成小的Xml。rnrn在我读完时,也就是第一个根节点读完,要读第二个根结点时,系统报异常(不能有mutiple root element)rnrn问题一:rn我不知有没有什么方式,戓是其他什么类可以让我成功的读这种不规则的Xml,如果有的话问题可以解决。rnrnrnrn因为前述问题,我又想了其它解决办法rnrn给文档加一个root element,希望文档是这样rnrn rn hehern rn rn haharn rnrn这样的数据,XmlTextReader读起来就没问题了。rn但是这个Stream太大,我不想把它转成字符串进行处理,我希望有一种方式可以在Stream有前面加一个StartElementrn再在Stream的尾加一个EndElement,由于我这样写rnrnMemoryStream ms ;rnStreamWriter sw = new StreamWriter(ms);rnms.Position = 0;rnsw.WriteLine("");rnms.Position = ms.Length -1;rnsw.WriteLine("");rnms.Position = 0;rnrn但是这样做好像是没有什么用,用XmlTextReader读它的时候,还是读不到我加上去的root element.rnrn问题二:rn有没有什么方式可以给Stream做类似padding的动作,前面加一点,后面加一点rn或者有没有什么方式让我构造一个新的Stream?构造的时候尽量不要copy,应为它实在太大了。rnrnrn请各位帮忙想想,如果没有什么办法的话,我就要自己动手写解析xml的程序了:(

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭