流模式访问Xml(一)
流模式访问Xml(一)
在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型。下面是我的学习笔记,主要是学习怎样用流模式访问Xml。
一.概述
DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。(不好意思,都是抄的:),说理解吗,也是有的)。
它是只读的,仅向前的,这一点是很明确的,如Ado.net中的DataReader。
下面是我在学习过程中在网上找到的,觉得总结的不错,借用一下:
XmlReader类用于Xml文件的一般读取操作,以下对这个类做简单介绍:
//Attributes(属性):
//listBox: 设置该属性主要为了得到客户端控件以便于显示所读到的文件的内容(这里是ListBox控件)
//xmlPath: 设置该属性为了得到一个确定的Xml文件的绝对路径
//Basilic Using(重要的引用):
//System.Xml: 该命名空间中封装有对Xml进行操作的常用类,本类中使用了其中的XmlTextReader类
//XmlTextReader: 该类提供对Xml文件进行读取的功能,它可以验证文档是否格式良好,如果不是格式良好的Xml文档,该类在读取过程中将会抛出XmlException
异常,可使用该类提供的一些方法对文档节点进行读取,筛选等操作以及得到节点的名称和值
//bool XmlTextReader.Read(): 读取流中下一个节点,当读完最后一个节点再次调用该方法该方法返回false
//XmlNodeType XmlTextReader.NodeType: 该属性返回当前节点的类型
// XmlNodeType.Element 元素节点
// XmlNodeType.EndElement 结尾元素节点
// XmlNodeType.XmlDeclaration 文档的第一个节点
// XmlNodeType.Text 文本节点
//bool XmlTextReader.HasAttributes: 当前节点有没有属性,返回true或false
//string XmlTextReader.Name: 返回当前节点的名称
//string XmlTextReader.value: 返回当前节点的值
//string XmlTextReader.LocalName: 返回当前节点的本地名称
//string XmlTextReader.NamespaceURI: 返回当前节点的命名空间URI
//string XmlTextReader.Prefix: 返回当前节点的前缀
//bool XmlTextReader.MoveToNextAttribute(): 移动到当前节点的下一个属性
二.一些例子
2.1 访问模式
string strXml = Server.MapPath("***.xml");
XmlTextReader xReader = new XmlTextReader(strXml);
while (xReader.Read())
{
//get what U want
}
xReader.Close();
2.2 简单的遍历
string strXml = Server.MapPath("Contack.xml");
XmlTextReader xReader = new XmlTextReader(strXml);
ListBox1.Items.Clear();
try
{
while (xReader.Read())
{
if (xReader.NodeType==XmlNodeType.Text) //文本
{
ListBox1.Items.Add("value is:" + xReader.Value);
//注意,如上xReader.Name为“”原因很简单,因为已经读到了//XmlNodeType.Text,所以,元素值早忘记了
//ListBox1.Items.Add(xReader.Name + "value is:" + xReader.Value);
}
}
}
catch (XmlException ex)
{
throw new XmlException(strXml+ex.ToString());
}
finally
{
if (xReader!=null)
{
xReader.Close();
}
}
2.3 遍历Element和Attribute
ListBox1.Items.Clear();
string strXml = Server.MapPath("Contack.xml");
XmlTextReader xReader = new XmlTextReader(strXml);
try
{
while (xReader.Read())
{
if (xReader.NodeType==XmlNodeType.Element) //元素节点
{
if (xReader.HasAttributes) //拥有属性
{
ListBox1.Items.Add(xReader.Name+" have attributes:");
while (xReader.MoveToNextAttribute())
{
//注意,下面也是有问题的,问题在xReader.Name
ListBox1.Items.Add(xReader.Name+"="+xReader.Value);
}
}
}
}
}
catch (XmlException ex)
{
throw new XmlException(strXml+ex.ToString());
}
finally
{
if (xReader!=null)
{
xReader.Close();
}
}
2.4 再多一点
ListBox1.Items.Clear();
string strXml = Server.MapPath("Contack.xml");
XmlTextReader xReader = new XmlTextReader(strXml);
try
{
while (xReader.Read())
{
if (xReader.NodeType==XmlNodeType.XmlDeclaration)
{
ListBox1.Items.Add(string.Format("<?{0}{1}?>",xReader.Name,\
xReader.Value));
}
else if (xReader.NodeType==XmlNodeType.Element)
{
string str = "";
str = string.Format("<{0}",xReader.Name);
if (xReader.HasAttributes)
{
while (xReader.MoveToNextAttribute())
{
str=str+string.Format("{0}={1}",\
Reader.Name,xReader.Value);
}
}
str = str+ ">";
//--------------也可以不在这读,用后面的类型判断的
xReader.Read(); //这里肯定是text了
str = str+xReader.Value;
ListBox1.Items.Add(str);
}
else if (xReader.NodeType==XmlNodeType.EndElement)
{
ListBox1.Items.Add(string.Format("</{0}>",xReader.Name));
}
/*else if (xReader.NodeType==XmlNodeType.Text)
{
ListBox1.Items.Add(xReader.Value);
}*/
}
}
catch (XmlException ex)
{
throw new XmlException(strXml+ex.ToString());
}
finally
{
if (xReader!=null)
{
xReader.Close();
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=496029